AsyncTask

一,什么是AsyncTask

二,AsyncTask的使用方法

三,AsyncTask的内部原理

四,AsyncTask的注意事项


一,什么是AsyncTask

意义:本质上是封装了线程池和handler的异步框架,来做耗时操作,因为封装了Handler,所以可以方便地在工作线程和子线程之间切换


二,AsyncTask的使用方法

1,三个参数(Integer:在执行AsyncTask时所要的参数,在后台任务时使用,Integer:在后台显示的进度,String:result,对结果进行返回)

2,5个方法:

onPreExecute():耗时操作前即开始线程前,做初始化操作

onInBackground():耗时后台计算----发到------->onPostExecute()

pulishprogress():发布进度单位

onProgressUpdate():动态显示进度条

onPostExecute():后台计算结果调用


三,机制原理

1,AsyncTask本质是静态线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是交到静态的线程池中执行。

2,线程池中的工作线程执行doInBackground(mParams)方法执行异步任务

3,当任务状态改变后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler会相应这些消息并调用相关的回调函数。

内部封装了线程池,通过mHandler发送消息,在UI线程,子线程中传递。


四,注意事项

1,内存泄漏

    AsyncTask会被声明为Activity的非静态内部类,会持有外部Activity的引用。

2,生命周期

如果不主动cancel(),就仍存在,如果不进行处理,则会导致崩溃

3,结果丢失

场景:屏幕旋转,内存不够,被杀

         此时AsyncTask会持有之前的引用,但这个引用已经无效了,所以说,用postExecute()更新界面也没有用,以上是AsyncTask()结果丢失的原因

4,并行或串行

       安卓1.6以前,AsyncTask是串行,会把AllTask放入线程池中一串一串地执行,在1.6到3.0版本是并行,2.3以后改为了串行,但仍然可以并行(用Execute on Execute())

      一般只用串行,可以保证线程池稳定,因为并发的话,线程池不稳,但效率高,AsyncTask一般做不了太高并发,高耗时的操作。

你可能感兴趣的:(AsyncTask)