在有界面的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 {@Overrideprotected 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;}@Overrideprotected void onPostExecute(Void v) {pBar.setVisibility(View.INVISIBLE);}@Overrideprotected void onProgressUpdate(Integer... values) {pBar.setProgress(values[0]);}}}

更多相关文章

  1. Android调用WebService之服务端实现(一)
  2. Android群英传第五章Scroll分析读书笔记
  3. 【Android】设置tabhost位于底部的三种方法
  4. View 的绘制流程
  5. Android平台上sqllite 简介
  6. Android(安卓)属性动画原理与DataBinding
  7. Android线程优先级设置方法
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. hive beeline ClassNotFoundException
  2. Redis5.0中的内存淘汰策略详解(最新的版本
  3. Java实现单向链表
  4. 为什么 MongoDB 索引选择B-树,而 Mysql 索
  5. Android实现取消GridView中Item选中时默
  6. 分享Android平板电脑上开发应用程序不能
  7. Eclipse中将一个android项目当做另外一个
  8. 导入Eclipse工程到Android(安卓)studio
  9. Springboot中的javaConfig详解(基于Spring
  10. Android(安卓)平滑和立体翻页效果1