介绍
这篇文章给大家介绍深入浅析Android中的AsyncTask,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
<强> 1,AsyncTask简介强>
AsyncTask作为Android的基础之一,怎么使用就不多讲解了,网上到处都是教程,建议查看Android官方API文档:https://developer.android.google.cn/reference/android/os/AsyncTask.html
这里只实现一个小演示程序,供大家赏玩:
界面:
这个程序其实特别简单,就是两个按钮,点击分别用来测试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的核心方法应该是
那我们就看下当调用了执行方法后,都发生了什么,下面是执行的序列图。
我知道我画的不够标准了,凑合着看吧。下面关于这个图的一些说明。
- <李>在第4步,执行的时候,这个时候可以看的到,doInBackground已经转到子线程中执行了,这个是很关键的一个点,我特意用了一个异步处理的箭头标注了。