AsyncTask(异步通信)

先new一个class继承AsyncTask类,AsyncTask要求提供三个泛型参数(Params 、Progress 、Result )其中,Params 为启动任务执行的输入参数,比如HTTP请求的URL;Progress 为后台任务执行的百分比;Result 后台执行任务最终返回的结果,比如String;然后AsyncTask的几个方法重写onPreExecute()、doInBackground()、onPostExecute()、onProgressUpdate(),其中doInBackground()为必须重写的; 例如:

<void onPreExecute() {super.onPreExecute();Log.i(“info”, “onPreExecute”);}Void doInBackground(Void… params) {publishProgress();Log.i(“info”, “doInBackground”);return null;}void onPostExecute(Void result) {super.onPostExecute(result);Log.i(“info”, “onPostExecute”);}void onProgressUpdate(Void… values) {super.onProgressUpdate(values);Log.i(“info”, “onProgressUpdate”);}}

值得注意的是这四个方法中只有doInBackground()方法不在主线程中运行,所以所有耗时操作我们将在doInBackground() 方法中进行,其他的三个方法都可以改变UI

下面来一个加载网上图片的案例: 布局文件:

====”@dimen/activity_vertical_margin”tools:context=”com.example.asynctaskdemo.ImageTestActivity” ><ProgressBar===”gone” /><ImageView==”true” /></RelativeLayout>

Java文件:

import java.io.BufferedInputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.View;import android.widget.ImageView;import android.widget.ProgressBar;{String URL = “https://www.baidu.com/img/bdlogo.png”;private ImageView iv_img;private ProgressBar pb_bar;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_image_test);iv_img = (ImageView) findViewById(R.id.iv_img);pb_bar = (ProgressBar) findViewById(R.id.pb_bar);MyscyncTask mTask = new MyscyncTask();mTask.execute(URL);}class MyscyncTask extends AsyncTask<String, Void, Bitmap> {() {super.onPreExecute();pb_bar.setVisibility(View.VISIBLE);}@Overrideprotected Bitmap doInBackground(String… params) {String url = params[0];HttpURLConnection conn = null;Bitmap bitmap = null;try {//线程休眠1秒,方便看进度条Thread.sleep(1000);conn = (HttpURLConnection) new URL(url).openConnection();InputStream is = conn.getInputStream();BufferedInputStream bis = new BufferedInputStream(is);bitmap = BitmapFactory.decodeStream(bis);bis.close();is.close();} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}return bitmap;}(Bitmap result) {super.onPostExecute(result);pb_bar.setVisibility(View.GONE);iv_img.setImageBitmap(result);}}}

为了方便查看代码所以我将AsyncTask写成了内部类 由于图片资源较小,,所以我用了一个线程休眠1秒,方便查看进度条

再来一个模拟进度条的案例

布局文件:

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”xmlns:tools=”http://schemas.android.com/tools”android:layout_width=”match_parent”android:layout_height=”match_parent”android:paddingBottom=”@dimen/activity_vertical_margin”android:paddingLeft=”@dimen/activity_horizontal_margin”android:paddingRight=”@dimen/activity_horizontal_margin”android:paddingTop=”@dimen/activity_vertical_margin”tools:context=”com.example.asynctaskdemo.ProgressBarTestActivity” ><ProgressBarandroid:id=”@+id/progressBar1″style=”?android:attr/progressBarStyleHorizontal”android:layout_width=”match_parent”android:layout_height=”wrap_content”android:layout_centerHorizontal=”true”android:layout_centerVertical=”true” /></RelativeLayout>

Java文件:

import android.os.AsyncTask;import android.os.AsyncTask.Status;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.widget.ProgressBar;{private ProgressBar progressBar1;private MyAsyncTask mTask;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_progress_bar_test);progressBar1 = (ProgressBar) findViewById(R.id.progressBar1);mTask = new MyAsyncTask();mTask.execute();}() {super.onPause();if(mTask != null && mTask.getStatus() == Status.RUNNING){mTask.cancel(true);}}class MyAsyncTask extends AsyncTask<Void, Integer, Void>{@Overrideprotected Void doInBackground(Void… params) {for (int i = 0; i < 100; i++) {if(isCancelled()){break;}try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}publishProgress(i);}return null;}(Integer… values) {super.onProgressUpdate(values);if(isCancelled())return;progressBar1.setProgress(values[0]);}}}

注意:由于AsyncTask底层是通过线程池进行作用的所以只有一个AsyncTask线程运行结束后另一个AsyncTask线程才可以运行,为了解决这一个为题,我们可以将AsyncTask的生命周期与Activity的生命周期进行绑定

还要高声歌唱。那歌声,一定是响遏流云的,

AsyncTask(异步通信)

相关文章:

你感兴趣的文章:

标签云: