在有界面的Android应用中,后台异步执行一些事情是常见的场景,这时候我们从底层开始写起的话,就需要了解比较深层的东西,比如这篇文章“Android 的消息队列模型”提到的Looper、Handler、Message、MessageQueue。

Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。

AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。

AsyncTask定义了三种泛型类型 Params,Progress和Result。

  • Params 启动任务执行的输入参数,比如HTTP请求的URL。
  • Progress 后台任务执行的百分比。
  • Result 后台执行任务最终返回的结果,比如String。

使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

  • doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
  • onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回

有必要的话你还得重写以下这三个方法,但不是必须的:

  • onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
  • onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
  • onCancelled() 用户调用取消时,要做的操作

使用AsyncTask类,以下是几条必须遵守的准则:

  • Task的实例必须在UI thread中创建;
  • execute方法必须在UI thread中调用;
  • 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
  • 该task只能被执行一次,否则多次调用时将会出现异常;

一个超简单的理解 AsyncTask 的例子:

这个例子后台sleep一定时间后更新前段进度条的进度,当完成后把进度条隐藏掉。

layout 文件

   1.0" encoding="utf-8"?>       http://schemas.android.com/apk/res/android"android:orientation="    vertical" android:layout_width="    fill_parent"android:layout_height="    fill_parent">         @+id/progress_bar" android:layout_width="     200dip" android:layout_height="     200dip" android:layout_gravity="     center" android:max="     100" android:progress="     0">        

代码文件

package ghj1976.AsyncTask;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.widget.ProgressBar;public class AsyncTaskActivity extends Activity {public ProgressBar pBar;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);pBar = (ProgressBar) findViewById(R.id.progress_bar);// AsyncTask.execute()要在主线程里调用new AsyncLoader().execute((Void) null);}// 设置三种类型参数分别为 Params = Void, Progress = Integer,Result = Voidclass AsyncLoader extends AsyncTask        {@Override    protected Void doInBackground(Void... params) {publishProgress(0);    try {Thread.sleep(1000);}     catch (InterruptedException e) {e.printStackTrace();}publishProgress(50);    try {Thread.sleep(1000);}     catch (InterruptedException e) {e.printStackTrace();}publishProgress(100);    return     null;}@Override    protected     void onPostExecute(Void v) {pBar.setVisibility(View.INVISIBLE);}@Override    protected     void onProgressUpdate(Integer... values) {pBar.setProgress(values[0]);}}}   

说明:

JAVA中类型后面跟三个点,表示的是可变数组参数
http://k.techq.com/a/java/20110111/23352.html

一些其他的例子可以看下面文章:

http://lichen.blog.51cto.com/697816/486868

参考资料:

Android AsyncTask
http://lichen.blog.51cto.com/697816/486868

Android AsyncTask 的使用
http://changxianli6121.blog.163.com/blog/static/56392130201042712956597/

从Foursquare看手机程序设计(3)
http://zhanwc.iteye.com/blog/834777

Android List列表网络资源异步调用
http://cai75951577.iteye.com/blog/793736

关于Android线程模型与AsyncTask
http://www.eoeandroid.com/thread-7607-1-1.html

更多相关文章

  1. Android中init.rc文件的解析
  2. Android定制RadioButton样式三种实现方法
  3. ActivityManagerService解读之Activity启动闲聊--以TaskSnapshot
  4. Android(安卓)图形系统剖析
  5. Android(安卓)Service的使用方法 音乐播放器实例
  6. Android应用程序(activity)启动过程(三)API28
  7. Android(安卓)的线程和线程池
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android(安卓)ndk r4b开发环境搭建
  2. andriod 4.0以上版本不调用onConfigratio
  3. Android(安卓)抽象回调函数以及接口回调
  4. coredump在Android上的应用
  5. Android(安卓)虚拟按键驱动实现
  6. android 信息(mms)的故事(五)-- 发彩信
  7. android支持有线网--网络上看到
  8. Android(安卓)源代码编后的目录分析
  9. android中实现返回首页功能
  10. android 存储简要分析