多线程实现方式implements Runnable或 extends Thread
Activity.runOnUIThread(Runnable)
View.post(Runnable)、View.postDelay(Runable,long)
Handler
AsyncTask
AsyncTaskLoader(3.0以后提供)
任何UI的操作都放到UI线程中,否则出现ANR错误
a.同一个HandlerThread可以有多个Handler吗?
答:同一个HandlerThread可以有多个Handler
b.同一个HandlerThread中使用多个Handler的Message会混淆吗?
答:同一个HandlerThread中使用多个Handler的Message不会混淆,每一个Message都有一个Target,该属性指向绑定的Handler
Handler不可以直接创建到任意的线程中去的,它应该在一个有Looper的Thread中创建,而且要在Looper准备好了之后(Looper.prepare()和Looper.loop();)
new Thread(newRunnable(){
@override
public void run() {
Handler mHandler = new Handler(Loooer.getMainLooper()){
@override
publicvoid handleMessage(Message msg){
super.handleMessage(msg);
//业务逻辑
}
};
mHandler.sendMessage();
}
}).start;
HandlerThread _HandlerThread = newHandlerThread("fang");
_HandlerThread.start();
Handler mHandler = new Handler(_HandlerThread.getLooper());
mHandler.sendEmptyMessage(1);
new Thread(newRunnable(){
@override
public void run() {
Looper.prepare();
Handler mHandler = new Handler(){
@override
publicvoid handleMessage(Message msg){
super.handleMessage(msg);
//业务逻辑
}
};
mHandler.sendMessage();
Looper.loop();
}
}).start;
a.定义两条有耗时操作的Message,并同时发送这两条消息
b.再定义一个Runnable,尝试同时执行Message和Runnable
答:当Handler发送两条Message后,该Message就会被放到MessageQueue上,只有当第一条Message执行完后,第二条Message才会被执行,即线性执行
同理:
当Handler发送一个Message和一个Runnable后,线性执行
当Handler发送两条Runnable后,线性执行
总结:
Message和Runnable共用同一个MessageQueue
a.调用removeMessage移除一个还没有开始执行的message,有什么效果
b.移除一个正在执行的message,有什么效果
答:调用removeMessage移除一个还没有开始执行的message时,该MessageQueue中的Message就不会被执行了。
移除一个正在执行的message时,removeMessage无效,该Message还要被执行完。
总结4-8点:
a.Handler实例与消息处理是关联的,发送和接收要匹配
b.可以通过设置Looper来选择器已给的线程
c. MessageQueue中的Message都是线性执行的(只有上一个Message执行完,才执行下一个Message)
d. removeMessage只能移除队列中未被处理的Message,一旦这个Message被处理进行时,此操作无效
Handler的post和sendMessage方法,使用的是同一个队列,sendMessage由handlerMessage函数处理,post由回调函数(Runnable函数)处理