Android中深入浅析的AsyncTask

  介绍

这篇文章给大家介绍深入浅析Android中的AsyncTask,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<强> 1,AsyncTask简介

AsyncTask作为Android的基础之一,怎么使用就不多讲解了,网上到处都是教程,建议查看Android官方API文档:https://developer.android.google.cn/reference/android/os/AsyncTask.html

这里只实现一个小演示程序,供大家赏玩:

界面:

深入浅析Android中的AsyncTask

这个程序其实特别简单,就是两个按钮,点击分别用来测试AysncTask和处理程序两种模式的实现,点击后会有相应的日志提示。

功能简介:

私有类IAsyncTask延伸AsyncTask<字符串,整数,String>{
  保护字符串doInBackground(字符串…args1) {
  日志。我(标签,“doInBackground:“+ args1 [0]);
  int *=10;
  for (int i=0;我& lt;次;我+ +){
  publishProgress (i);//提交之后,会执行onProcessUpdate方法
  }
  日志。我(标签,“doInBackground out");
  返回“over";
  }/* *
  *在调用取消方法后会执行到这里
  */空白> mBtnSyncTask保护。setOnClickListener(新View.OnClickListener () {
  @Override
  公共空间> 02-19 21:55:12.179 10824 - 11010/com.plbear。asynctasktest I/asynctasktest: doInBackground: yanlog测试//doInBackground是在10824年进程,11010线程中执行
  02-19 21:55:12.179 10824 - 11010/com.plbear。asynctasktest I/asynctasktest: doInBackground出去
  02-19 21:55:12.184 10824 - 10824/com.plbear。asynctasktest I/asynctasktest:>私有类{IHandler扩展处理程序
  @Override
  公共空间handleMessage(消息味精){
  开关(msg.what) {
  案例1:
  Log.e(标签,“处理程序:“+ msg.obj);
  打破;
  默认值:
  打破;
  }
  }
  }

其中,调用地方如下:

mBtnHandlerTest。setOnClickListener(新View.OnClickListener () {   @Override   公共空间> 02-19 22:25:17.689 9234 - 9319/com.plbear。asynctasktest E/asynctasktest:发布消息:0//可以看到提交是在9319号子进程中提交   02-19 22:25:17.689 9234 - 9319/com.plbear。asynctasktest E/asynctasktest:发布消息:1   02-19 22:25:17.689 9234 - 9319/com.plbear。asynctasktest E/asynctasktest:发布消息:2   02-19 22:25:17.689 9234 - 9319/com.plbear。asynctasktest E/asynctasktest:发布消息:3   02-19 22:25:17.689 9234 - 9319/com.plbear。asynctasktest E/asynctasktest:发布信息:4   02-19 22:25:17.689 9234 - 9319/com.plbear。asynctasktest E/asynctasktest:发布消息:5   02-19 22:25:17.689 9234 - 9319/com.plbear。asynctasktest E/asynctasktest:发布消息:6   02-19 22:25:17.689 9234 - 9319/com.plbear。asynctasktest E/asynctasktest:发布消息:7   02-19 22:25:17.689 9234 - 9319/com.plbear。asynctasktest E/asynctasktest:发布消息:8   02-19 22:25:17.689 9234 - 9319/com.plbear。asynctasktest E/asynctasktest:发布消息:9   02-19 22:25:17.692 9234 - 9234/com.plbear。asynctasktest E/asynctasktest:处理程序:0//可以看到提交完是在9234年主线程中执行。   02-19 22:25:17.692 9234 - 9234/com.plbear。asynctasktest E/asynctasktest:处理程序:1   02-19 22:25:17.692 9234 - 9234/com.plbear。asynctasktest E/asynctasktest:处理程序:2   02-19 22:25:17.692 9234 - 9234/com.plbear。asynctasktest E/asynctasktest:处理程序:3   02-19 22:25:17.692 9234 - 9234/com.plbear。asynctasktest E/asynctasktest:处理程序:4   02-19 22:25:17.692 9234 - 9234/com.plbear。asynctasktest E/asynctasktest:处理程序:5   02-19 22:25:17.692 9234 - 9234/com.plbear。asynctasktest E/asynctasktest:处理程序:6   02-19 22:25:17.692 9234 - 9234/com.plbear。asynctasktest E/asynctasktest:处理程序:7   02-19 22:25:17.692 9234 - 9234/com.plbear。asynctasktest E/asynctasktest:处理程序:8   02-19 22:25:17.692 9234 - 9234/com.plbear。asynctasktest E/asynctasktest:处理程序:9

以上,简单梳理了下怎么实现,不赘言。

关于处理器+信息+消息队列+尺蠖的实现就不介绍了,老生常谈了。所以下面主要看一下AsyncTask的源码实现:

AsyncTask的核心方法应该是

那我们就看下当调用了执行方法后,都发生了什么,下面是执行的序列图。

深入浅析Android中的AsyncTask

我知道我画的不够标准了,凑合着看吧。下面关于这个图的一些说明。

    <李>在第4步,执行的时候,这个时候可以看的到,doInBackground已经转到子线程中执行了,这个是很关键的一个点,我特意用了一个异步处理的箭头标注了。

    Android中深入浅析的AsyncTask