AsyncTask的机制原理:
1.本质是一个静态线程池,派生出来的子类的任务都提交的到静态线程池中去执行。
2.在doInBackground()方法中是在工作线程执行异步任务调用而方法。
3.任务状态改变,是由任务线程发送给UI线程消息,AsyncTask中有个InteralIntent来接收消息回调给先关方法,例如:onPreExcute9()/onProgressUpdate()/onResultExcute()。
注意事项:
1.内存泄漏,与hundler原因差不多,asyncTask非静态内部类持有外部类(Activity)的匿名引用,导致Activity无法回收,解决方法(a)声明也静态内部类;(b)构造函数持有activiy的弱引用;(c)在activity中的onDestroy方法中调用asyncTsak.cancel()取消异步任务。
2.生命周期,asyncTsak不会onDestroy()中自动销毁,所以需要手动调用syncTsak.cancel()销毁异步任务。
3.结果丢失,asyncTsak执行后,所在的activity被回收或屏幕旋转,导致生成新的activity,但是asyncTsak还再持有旧的activity的引用(无效的引用),其状态无法通知到新的activity中,故而结果丢失。
4.并行或串行,android1.6之前asyncTsak都是串行,有序执行;1.6-2.3为并行(并发);2.3以后又改为串行,也可以并行通多excuteOnExcutor()方法,会使整个线程池不稳定,官方不建议这样做。AsyncTask做不了高并发、太耗时的操作,太耗时的操作应使用后台service。