Android异步载入全解析之使用AsyncTask

概述

既然前面提到了多线程,就不得不提到线程池,通过线程池,不仅能够对并发线程进行管理。更能够提高他们运行的效率。优化整个App。当然我们能够自己创建一个线程池。只是这样是非常烦的,要创建一个高效的线程池还是挺费事的,只是,Android系统给我吗提供了AsyncTask这样一个类,来帮助我们高速实现多线程开发,它的底层实现,事实上就是一个线程池。

AsyncTask初探

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

AsyncTask參数

抽象类AsyncTask具有三个泛型參数:
AsyncTask <Params, Progress, Result>

  • 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<String, Void, Bitmap> {

    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, Void, Bitmap>

即參数类型为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);

最后,显示当然是没有问题,就不贴图了。

我的Github 我的视频 慕课网

Android异步载入全解析之使用AsyncTask的更多相关文章

  1. Android异步载入全解析之IntentService

    Android异步载入全解析之IntentService 搞什么IntentService 前面我们说了那么多,异步处理都使用钦定的AsyncTask.再不济也使用的Thread,那么这个Intent ...

  2. Android异步载入全解析之大图处理

    Android异步载入全解析之大图处理 异步载入中很重要的一部分就是对图像的处理,这也是我们前面用异步载入图像做示例的原因. 一方面是由于图像处理不好的话会很占内存,并且easyOOM,还有一方面,图 ...

  3. Android异步载入全解析之使用多线程

    异步载入之使用多线程 初次尝试 异步.异步,事实上说白了就是多任务处理.也就是多线程执行.多线程那就会有各种问题,我们一步步来看.首先.我们创建一个class--ImageLoaderWithoutC ...

  4. Android异步载入全解析之开篇瞎扯淡

    Android异步载入 概述 Android异步载入在Android中使用的很广泛,除了是由于避免在主线程中做网络操作.更是为了避免在显示时由于时间太长而造成ANR,添加显示的流畅性,特别是像List ...

  5. Android异步载入AsyncTask具体解释

    曾看见有人说过.认为非常有道理.分享一下:   技术分为术和道两种:   (1)具体做事的方法是术.   (2)做事的原理和原则是道. 近期项目发现个重大问题.结果打log跟踪查是AsyncTask导 ...

  6. Android 异步消息处理机制解析

    Android 中的异步消息处理主要由四个部分组成,Message.Handler.MessageQueue.Looper.下面将会对这四个部分进行一下简要的介绍. 1. Message: Messa ...

  7. Android异步载入学习笔记之四:利用缓存优化网络载入图片及ListView载入优化

    假设不做不论什么处理.直接用网络载入图片在网速快的情况下可能没什么不好的感觉.可是假设使用移动流量或是网络不好的时候.问题就来了,要么用户会抱怨流量使用太多.要么抱怨图片载入太慢.如论从哪个角度出发, ...

  8. 转:android异步任务设计思详解(AsyncTask)

    这里说有设计思想是我根据查看Android源代码提炼出来的代码逻辑,所以不会跟Google工程师的原始设计思想100%符合(也有可能是0%),但是本文一定可以帮助你理解AsyncTask,也可能有一些 ...

  9. Android系统启动过程全解析

    Android系统是一款基于Linux的移动操作系统,那么Android是如何启动起来的呢?本文就详细阐述Android系统的启动过程. 从内核之上,我们首先应该从文件系统的init开始,因为 ini ...

随机推荐

  1. IO流(二)I/O

    一.IO流概述 1.定义:Java的IO流是实现输入输出的基础,它可以方便地实现数据的输入/输出操作. 2.流的分类: (1)按流向来分:输入流和输出流 (2)按操作的数据来分:字节流和字符流 (3) ...

  2. jmap命令(Java Memory Map)的使用

    jmap的使用能够參考: 官方文档 http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html 和这篇博客 http:// ...

  3. NYOJ-277-车牌号

    车牌号 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描写叙述 茵茵非常喜欢研究车牌号码,从车牌号码上能够看出号码注冊的早晚,据研究发现,车牌号码是按字典序发放的,如今她收集 ...

  4. 【BIEE】05_启动BIEE时,无法启动BI_SERVER

    本地修改资料库后,重新启动BIEE,结果报错: 点击[查看日志信息]后 从这里是没看出是什么问题造成的,那么我们就要去查询启动日志了 问题解决 找到日志路径:D:\obiee\instances\in ...

  5. VM里面的桥接

      今天我们谈一谈桥接模式,一般的时候,我用的是NAT模式,需要设置另一个虚拟网卡的IP地址,而不是借助本机的物理网卡.   编辑---虚拟网络编辑器 有些时候直接设置桥接到某个网卡可能会不成功,我们 ...

  6. Java 过滤所有html标签,复制文件到指定位置

    public static String filterHtml(String string) { String str = string.replaceAll("<[a-zA-Z]+[ ...

  7. 谈谈PHP网站的防SQL注入

    SQL(Structured Query Language)即结构化查询语言.SQL 注入,就是把 SQL 命令插入到 Web 表单的输入域或页面请求参数的查询字符串中,在 Web表单向 Web 服务 ...

  8. 乐鑫esp8266的 基于Nonos移植红外线1883,实现遥控器控制

    代码地址如下:http://www.demodashi.com/demo/12613.html 一.前言. 距离上篇的8266进阶博文有那么一段时间了,那么本文带来的是基于Nonos的红外线H1838 ...

  9. 如何在 Linux 中找到你的 公网IP 地址

    每个网站都有一个独有的公开 IP 地址,可供任何人从任何地方访问. 互联网协议Internet Protocol(IP)不需要介绍 —— 我们每天都在使用它.即使你不直接使用它,当你在浏览器上输入 w ...

  10. sql server 执行大.sql文件

    打开cmd执行:osql -S 127.0.0.1 -U sa -P sa -i d:\test.sql 执行后会提示输入密码.