Android 多线程工具Handler、AsyncTask总结



Handler


一、Handler目的与 作用
用于线程间通信,避免多线程导致的同步问题, 确保通信安全
通常用于刷新UI,但是也可以用于子线程间通信。



二、 Handler相关类:
Tread: 线程是一个并发执行的最小单元。

Handler:向消息队列 发送消息或者 处理消息

Message:一种包含描述和任意数据而且能够发送给Handler的数据结构。

Looper: 用于从循环从消息队列中取出消息。(一个线程一个Looper,负责调度避免同步,逐个消息进行执行)

MessageQueue:保存被Looper分发的Message队列。

AsyncTask



三、Handler 规则
1. 一个线程仅能有一个Looper实例,主线程创建Handler的时候Framework自动创建一个Looper实例。
2. 每一个Looper只有一个MessageQueue,线程、Looper、MessageQueue一一对应。MessageQueue通常开发者都不需要处理,只要保证handler的所在线程中有Looper就行,尤其负责MessageQueue的创建与操作。
3. 一个线程可以有多个Handler实例,每一个Handler.post*方法和Handler.sendMessage*方法都是向Looper管理的MessageQueue发送一个消息。
4. Handler.removeMessage方法仅能从消息队列中删除消息,如果删除前待删除消息被Looper执行回调Handler.handleMessage则执行removeMessage无任何效果,毕竟其功能仅仅只能从消息队列中删除效果。



四、通过Looper创建Handler的办法
1. 如果是UI线程的Handler不需要创建Looper,因为UI线程Handler的构造器会创建Looper。
2. 获取主线程的Looper,Hander的处理执行在主线程(UI线程)
new Handler(Looper.getMainLooper()); 
3. 如果任意子线程想在自己线程内处理此消息,必须在此子线程中创建Looper,子线程中添加如下代码,含义是当前子线程用于处理Message:
Looper.prepare();
mHandler = new Handler(Looper.myLooper());
Looper.loop();

* 注意
在想在子线程中处理Message看以上要写的代码,而且有如下问题:
1. 相对比较麻烦,每次都要记得执行相应方法获取子线程的looper
2. 多个子线程获取同一个looper的时候会出现数据不同步问题
针对以上问题Android Framework提供一个HandlerThread工具类,问题1的解决就是在创建的时候其内部处理looper,问题2的解决办法见如下内部源码
synchronized (this) {
    mLooper = Looper.myLooper();
    // 使用此方法确保所有更新避免同步问题
    notifyAll();
}


AsyncTask

五、 AsyncTask
className extends AsyncTask<Params, Progress, Result>
可以覆写方法:
doInBackground() :用于后台执行耗时任务,参数是通过 Params传入。(原理是使用多线程)
onPostExecute()   :更新UI (原理是使用Handler)

onPreExecute()     :主要用于初始化处理
onProgressUpdate(): 用于进度更新

规则:
1. execute方法必须在UI线程创建
2. 不要手动执行覆写的方法,即 doInBackground() 等

简单原理:
使用Executor.execute(task) 提交任务到线程池。最大活跃数是5,支持最多128个任务
内部使用Handler保证UI线程刷新。


结合Handler和线程池、线程池支持最大是128个


何时使用?
1. 任务需要终止
2. 与UI频繁交互



参考资料:
Android异步处理系列文章索引
http://blog.csdn.net/mylzc/article/details/6777767
由浅入深

android的消息处理机制(图+源码分析)——Looper,Handler,Message 
http://www.cnblogs.com/codingmyworld/archive/2011/09/12/2174255.html
图画的非常漂亮


Android – Multithreading in a UI environment
http://www.aviyehuda.com/blog/2010/12/20/android-multithreading-in-a-ui-environment/
例子比较齐全

Handler相关概念解释的不错
http://www.cnblogs.com/plokmju/p/android_handler.html


你可能感兴趣的:(Android 多线程工具Handler、AsyncTask总结)