问题解答-AsyncTask问题汇总及解答

本篇博文部分由本人所写,部分由网友总结,如有纰漏,请留言我将尽快调整,谢谢!

 

  • AsyncTask机制

AsyncTask主要由两个线程池和一个Handler组成。

AsyncTask对象在初始化的过程中,分别初始化了Handler,WorkerRunnable,FuturaTask三个对象,这个Handler是用来处理消息的(回调oncancel,onPostExecute,onProgressUpdate方法)。WorkerRunnable中封装了doinBackgroud方法,而FuturaTask实现了runnable接口,并将创建的workerRunable作为参数传入。

AsyncTask启动之后,调用executeOnExecutor方法,先判断了一下AsyncTask的执行状态,然后调用了onPreExecute方法。这里如果不采用系统默认的AsyncTask的线程池,执行完了之后调用WorkerRunnable的postResult方法传递结果。如果采用系统默认的AsyncTask的线程池,一个先被调用用来按照循序插叙队列,而另外一个用来执行异步的任务,执行完了之后也是调用WorkerRunnable的postResult方法传递结果。postResult是通过handler进行传递消息的,最终会交给AsyncTask的finish处理,这里首先会判断AsyncTask是否被取消,若已取消调用onCancel方法,没有被取消调用onPostExecute,最后一个标识这个异步已经处理完成了。

 

  • AsyncTask不足

1.跟handler一样,容易造成内存泄露

2.AsyncTask由于不与Activity绑定,所以可能导致doinbackground结果的丢失,以及onPostExecute方法方法的报错

3.AsyncTask对象的execute方法必须在主线程中调用

 

  • 如何取消AsyncTask

通过cancel方法,但是doinbackground不是会立刻取消执行,必要时可以通过isCancelled判断进行return,结束doinbackground中操作

 

  • AsyncTask各个版本的差别

最主要的差别是在执行任务的时候是并行还是串行

1.6之前用一个单一的后台线程串行执行多个AsyncTask实例的任务

1.6到3.0只有1个线程池,核心线程数为5,最大线程数为128,任务队列容量为10。

3.0以上又改回串行执行多个DoinBackGround(有两个线程池调度)。

更加详细的请点击

 

  • AsyncTask使用的注意事项

1.在调用oncancel方法的时候需要注意,在doinbackground报错的时候时候,AsyncTask将也会调用方法

2.AsyncTask需要在UI线程中初始话及执行(初始话时需要初始话handler)

3.AsyncTask只能执行一次

4.不要在AsyncTask之外直接调用doInBackground、onPreExecute、onPostExecute 、onProgressUpdate这几个方法

5.默认只支持单线程处理doInBackground方法

 

  • AsyncTask与Handler的关系

AsyncTask内部还是靠handler进行线程间的调度,AsyncTask是对handler的一次封装,让我们不用自行的创建线程,就能完成一些耗时的操作

 

  • 为什么不能在子线程更新UI?

android系统当中的控件都不是线程安全的,这将导致在多线程模式下,当多个线程共同访问更新操作同一个UI控件时容易发生不可控的错误,而这是致命的。但若在主线程加锁的话,肯定会影响主线程的卡顿,这势必会影响性能,给用回带来不好的体验。所以Android中规定只能在UI线程中访问UI,这相当于从另一个角度给Android的UI访问加上锁,一个伪锁。

拓展阅读:https://blog.csdn.net/haoyuegongzi/article/details/79414081

 

你可能感兴趣的:(Android,总结)