CSDN上的这个系列文章《Android异步处理系列文章索引》对AsyncTask讲解的很清楚,特别是其中的几个例子特别好。最近在在做一个Android应用开发,都是用AsyncTask来完成后台任务,简单总结一下。

通常使用AsyncTask,是通过继承这个超类来完成的,如:

class BackgroundTask extends AsyncTask<Object,Object,Object> 
{
@Override
protected Object doInBackground(Object... params)
{
return null;
}
}

子类必须重载 doInBackground方法。“<>”里面的三个类型,依次代表执行参数类型、进度参数类型和结果参数类型。doInBackground的参数类型必须是执行参数类型,返回的类型必须和结果参数类型。这三个类型应该根据需要来定,其实用Object也可以,用的时候在做类型转换。启动一个AsyncTask,可以在这样做:

BackgroudTask bt = new BackgroundTask();
bt.execute("param");

使用AsyncTask的容易犯下的错误是在doInBackground方法里面直接对UI元素进行操作。如果需要和UI进行交互,可以配合使用publishProgress和onProgressUpdate。比如

    @Override
protected Object doInbackground(Object... params)
{
...
publishProgress("完成了20%");
...
publishProgress("完成了80%");
...
return null;
}

protected void onProgressUpdate(Object... progress){
...
textView1.setText((String)progress[0]);
...
}

这里onProgressUpdate是工作在UI线程的。

使用AsyncTask的另一个问题是关于cancel。实际上,单单调用AsyncTask对象的cancel方法,并不能停止doInBackground方法的继续执行。通常比较接受的方法是设置一个标志位,也就是在每次执行前检查一下某个变量的值(或者可以调用isCancelled方法判断),来决定继续执行还是停止。这种处理手段对于一些循环性的工作比较有用,但是对于一些循环性弱的工作可能并不怎么有效。这也算是AsyncTask的一个弱点。和Thread相比,AsyncTask还有一个弱点是效率的问题,这个可以在本文开头给出的链接中找到相关的信息。

AsyncTask还有一个问题和onPreExecute方法有关。这个方法是工作在UI线程的。虽然是叫onPreExecute,但是doInBackground方法(也就是实际上的execute),并不会等待onPreExecute方法做完全部操作才开始执行。所以,一般还是不要用这个方法,可以在调用AsyncTask对象的execute方法之前就把该完成的操作完成,以免引起某些错误。

AsyncTask还有一个方法是onPostExecute,这个方法也是工作在UI线程,它是在doInBackground方法执行结束,并返回结果后调用。这个方法里面可以调用UI线程的startActivity,这样可以实现完成大量后台操作后,自动跳转Activity的功能。这个方法里面也可以执行另一个AsyncTask的execute方法。

来自:http://www.cnblogs.com/tt-0411/archive/2012/03/25/2410830.html

更多相关文章

  1. Android9.0 SIM卡初始化---更新数据(代码 高通9.0代码)
  2. 单独编译Android(安卓)app模块
  3. Android(安卓)WMS分析(一) WindowManager
  4. Android(安卓)studio 添加依赖库的方法
  5. Android关于PagerAdapter的使用方法的总结
  6. Android(安卓)判断当前的界面是否是桌面的方法
  7. Android(安卓)自定义camera
  8. Android2.1 短信应用解析
  9. 【Android】Activity_习题

随机推荐

  1. 基于Android6.0的RIL底层模块分析
  2. 在Webview上加载脱机更新页面
  3. 如何使用java RESTful Web服务将通知推送
  4. Java项目无法通过BufferedWriter向服务器
  5. Android无法加载第三方so的解决方法
  6. Android 打包VersionCode自增、APK文件名
  7. Android6.0的phone应用源码分析(5)——RIL
  8. 由Android架构图所想到的Android开发学习
  9. 在两台设备上播放一首音乐
  10. [置顶] Android系统的样式style