当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > Android异步加载AsyncTask的使用

Android异步加载AsyncTask的使用 时间:2018-09-26      来源:未知

Android系统给我们提供了AsyncTask这样一个类,来帮助我们快速实现多线程开发,它的底层实现,其实就是一个线程池。

AsyncTask,顾名思义就是用来做异步处理的。通过AsyncTask,我们可以非常方便的解决多线程,以及多线程之间的通信问题。

AsyncTask参数

抽象类AsyncTask具有三个泛型参数:

AsyncTask

Params: 这个泛型指定的是我们传递给异步任务执行时的参数的类型

Progress: 这个泛型指定的是我们的异步任务在执行的时候将执行的进度返回给UI线程的参数的类型

Result: 这个泛型指定的异步任务执行完后返回给UI线程的结果的类型

我们在创建AsyncTask的时候,需要指定这三个参数。

AsyncTask方法

AsyncTask具有这样几个抽象方法:

onPreExecute(): 这个方法是在执行异步任务之前的时候执行,并且是在UI Thread当中执行的,通常我们在这个方法里做一些UI控件的初始化的操作,例如弹出ProgressDialog

doInBackground(Params... params): 在onPreExecute()方法执行完之后,会马上执行这个方法,这个方法就是来处理异步任务的方法,

Android操作系统会在后台的线程池当中开启一个worker thread来执行我们的这个方法,所以这个方法是在worker thread当中执行的,这个方法执行完之后就可以将我们的执行结果发送给我们的后一个 onPostExecute 方法,因此,doInBackground是这四个方法中唯一必须要重写的方法,在这个方法中,我们可以从网络当中获取数据等一些耗时操作

onProgressUpdate(Progess... values): 这个方法也是在UI Thread当中执行的,我们在异步任务执行的时候,

有时候需要将执行的进度返回给我们的UI界面,例如下载一张网络图片,我们需要时刻显示其下载的进度,

就可以使用这个方法来更新我们的进度。这个方法在调用之前,我们需要在 doInBackground 方法中

调用一个 publishProgress(Progress) 的方法来将我们的进度时时刻刻传递给 onProgressUpdate 方法从而来更新进度

onPostExecute(Result... result): 当我们的异步任务执行完之后,就会将结果返回给这个方法,这个方法也是在UI Thread当中调用的,

我们可以将返回的结果显示在UI控件上

AsyncTask使用

现在回到我们的例子中,我们利用AsyncTask来下载图像,当然,下载图像的方法还是使用那个getBitmapFromUrl()方法。首先,我们先写一个ASyncDownloadImage类,继承AsyncTask:

private class ASyncDownloadImage extends AsyncTask {

private ImageView imageView;

private String url;

public ASyncDownloadImage(ImageView imageView, String url) {

this.imageView = imageView;

this.url = url;

}

@Override

protected Bitmap doInBackground(String... params) {

return getBitmapFromUrl(params[0]);

}

@Override

protected void onPostExecute(Bitmap bitmap) {

super.onPostExecute(bitmap);

if (imageView.getTag().equals(url)) {

imageView.setImageBitmap(bitmap);

}

}

}

这个AsyncTask我们重写了doInBackground用来异步下载图像,重写了onPostExecute来将图像设置到ImageView上。因此,我们将AsyncTask的三个泛型参数设置为:

AsyncTask

即参数类型为String——url,进度类型——Void 不需要,返回类型——Bitmap 下载的图像。在设置图像的时候,我们同样需要通过tag来进行判断。

后,我们与使用多线程一样,创建一个showImageByASync方法,来调用AsyncTask:

/**

* Using ASyncTask

* @param imageView

* @param url

*/

public void showImageByASync(ImageView imageView, String url) {

ASyncDownloadImage task = new ASyncDownloadImage(imageView, url);

task.execute(url);

}

AsyncTask中有几个地方还是需要注意下的:

execute方法只能在UI线程中调用

AsyncTask实例也必须在UI线程中创建

AsyncTask的抽象方法不要手动去调用,系统自动会去管理

AsyncTask只能执行一次

后,只需要将Adapter中的getView方法的mImageLoader.showImageByThread(viewHolder.imageView, url);改为如下所示即可:

mImageLoader.showImageByASync(viewHolder.imageView, url);

上一篇:Linux下多线程机制

下一篇:关于C语言的隐式类型转换

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部