AsyncTask使用介绍

来源:互联网 发布:17173英雄联盟数据 编辑:程序博客网 时间:2024/05/22 12:52

在安卓中,通常我们进行一些耗时的操作时,我们会新开启一个线程去做这个耗时的事情,等到这个线程处理完毕之后,我们再向UI线程发送message,主线程的Handler收到消息后会去更新ui线程.这样写代码很麻烦,因为我们既要在子线程中写代码,又要在主线程中写代码.

为了解决这个问题,Android1.5提供了工具类android.os.AsyncTask.我们先来看下这个类的签名:

public abstract class AsyncTask<Params, Progress, Result> 
可以看出这是一个泛型类,又是一个抽象类.所以想要用这个类的时候比不继承这个类.首先阐释一下这几个泛型参数的意义:

1.Params表示用于AsyncTask执行任务的传入参数的类型
2.Progress表示在后台线程处理的过程中,表示目前处理的进度的类型
3.Result表示任务全部完成后所返回的数据类型

如果不需要使用这些类型,可以使用void类型代替.

要完成这个异步任务类,还需要实现里几个重要的方法,这几个方法大概流程是这样的,执行之前->开始执行->执行过程中->执行完毕.

1.onPreExecute:该方法有MainThread注解,表示该方法是运行在主线程中的。在AsyncTask执行了execute()方法后就会在UI线程上执行onPreExecute()方法,该方法在task真正执行前运行,我们通常可以在该方法中显示一个进度条,从而告知用户后台任务即将开始。

2.doInBackground:该方法有WorkerThread注解,表示该方法是运行在单独的工作线程中的,而不是运行在主线程中。这个方法在onPreExecute()方法执行完成后立即执行,该方法用于在工作线程中执行耗时任务,该方法接收Params泛型参数,参数params是Params类型的不定长数组,该方法的返回值是Result泛型,由于doInBackgroud是抽象方法,我们在使用AsyncTask时必须重写该方法。在doInBackground中执行的任务可能要分解为好多步骤,每完成一步我们就可以通过调用AsyncTask的publishProgress(Progress…)将阶段性的处理结果发布出去,阶段性处理结果是Progress泛型类型。当调用了publishProgress方法后,处理结果会被传递到UI线程中,并在UI线程中回调onProgressUpdate方法,根据我们的具体需要,我们可以在doInBackground中不调用publishProgress方法,当然也可以在该方法中多次调用publishProgress方法。doInBackgroud方法的返回值表示后台线程完成任务之后的结果。

3.onProgressUpdate:该方法运行在主线程中,可以 用来更新用户UI,该方法被调用发生在publishProgress方法被调用的时候.

4.onPostExecute:该方法运行中在主线程中,接受一个返回结果Result,可以用来更新UI界面,将结果呈现在页面上


重写以上方法之后,要想异步任务能运行,还必须调用execute()方法.

下面提供一个利用异步任务类下载图片的例子:

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.asynctask.MainActivity" >    <Button        android:id="@+id/button1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_centerHorizontal="true"        android:text="下载"        android:onClick="download"         />    <ImageView        android:id="@+id/iv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentTop="true"        android:layout_centerHorizontal="true"        android:layout_marginTop="169dp"        android:src="@drawable/ic_launcher" /></RelativeLayout>
2.后台java代码

public class MainActivity extends Activity {private ProgressDialog progressDialog;private ImageView imageView;ByteArrayOutputStream outputStream;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = (ImageView) findViewById(R.id.iv);progressDialog = new ProgressDialog(this);progressDialog.setTitle("提示信息:");progressDialog.setMessage("正在下载");progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);}public void download(View v) {String url = "http://img05.tooopen.com/images/20150820/tooopen_sy_139205349641.jpg";new DownLoad().execute(url);}class DownLoad extends AsyncTask<String, Integer, Bitmap> {private InputStream inputStream;@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();progressDialog.show();}@Overrideprotected Bitmap doInBackground(String... arg0) {// TODO Auto-generated method stuboutputStream = new ByteArrayOutputStream();Bitmap bitmap = null;HttpClient httpClient = new DefaultHttpClient();HttpGet httpGet = new HttpGet(arg0[0]);try {HttpResponse httpResponse = httpClient.execute(httpGet);if (httpResponse.getStatusLine().getStatusCode() == 200) {// HttpEntity entity=httpResponse.getEntity();// //转为字节数组// byte[] data=EntityUtils.toByteArray(entity);// bitmap=BitmapFactory.decodeByteArray(data, 0,// data.length);inputStream = httpResponse.getEntity().getContent();// 获取文件的总长度long contentLength = httpResponse.getEntity().getContentLength();int len = 0;byte[] data = new byte[1024];int totalLength = 0;while ((len = inputStream.read(data)) != -1) {totalLength += len;int value = (int) ((totalLength / (float) contentLength) * 100);publishProgress(value);outputStream.write(data, 0, len);}byte[] result = outputStream.toByteArray();bitmap = BitmapFactory.decodeByteArray(result, 0,result.length);}} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return bitmap;}@Overrideprotected void onProgressUpdate(Integer... values) {// TODO Auto-generated method stubsuper.onProgressUpdate(values);progressDialog.setProgress(values[0]);}@Overrideprotected void onPostExecute(Bitmap result) {// 这里的result就是doInBackground 返回的结果imageView.setImageBitmap(result);progressDialog.dismiss();}}}











原创粉丝点击