AsyncTask 基本概念

android 1.6之前的版本版本AsyncTask都是串行,也就是它会把所有的任务都一串一串的放在线程池中,有序的进行执行,而在1.6和2.3版本的时候,它改成了并行,但是在2.3版本以后为了维护系统的稳定,google又把它改成了串行,但是它还是可以执行并行,执行并行的时候可以调用executeOnExecutor()这个方法就可以并行,一般建议只使用串行,这样能保证整个线程池的稳定,因为如果并发的话,整个线程池内部其实是不稳定的,虽然它效率很高,但是AsyncTask一般做不了高并发,太耗时的操作。

AsncTask框架的整体结构。

AsynTask的五个方法
onPreExecute() //后台执行开始前调用。用于进行一些界面上的初始化操作
doInBackground() //执行耗时代码。这个方法中的所有代码都会在子线程中运行
pushlishProgress() //在doInBackground中调用,为触发onProgressUpdate
onProgressUpdate()//主线程更新ui
onPostExecute() //后台执行完成时调用。当后台任务执行完毕并通过return语句进行返回时
OnDestroy()生命周期方法里面进行syncTask的cancel()方法调用。

AsyncTask的机制原理
1.AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行。
2.线程池中的工作线程执行doInBackground(mParams)方法执行异步任务
3.当任务状态改变之后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler相应这些消息,并调用相关的回调函数。

注意:
在屏幕旋转,或activity由于后台系统杀掉,就是内存不够的情况下被杀掉,会导致activity被重新创建,之前运行的AsyncTask会持有当前Activity的引用,但是这个引用已经无效了,所以说这时调用AsyncTask的onPostExecute()去更新界面,就是不会在生效,这就是asyncTask结果丢失的原因。
解决方法:
OnDestroy()生命周期方法里面进行syncTask的cancel()方法调用。

当Activity被销毁时,其实AsyncTask还在后台执行,所以又与handler一样存在内存泄漏问题,解决方法同handler类似



作者:就头名
链接:https://www.jianshu.com/p/b7904b991f00

猜你喜欢

转载自blog.csdn.net/fdsafwagdagadg6576/article/details/82193208