多线程
ANR:application not responding应用无响应,主要原因主线程(UI)产生阻塞
Thread+Handler
Thread处理一些复杂的业务逻辑(耗时的事情)
Handler在主线程中接收消息的一个对象
mHandler.sendMessage(msg); 发送一个消息对象
mHandler.sendEmptyMessage(what) 发送空消息,只有what没有obj
mHandler.send...Delayed()延迟发送
mHandler.post...() 提交一个任务到目标线程执行
mHandler.post(new Runnable() {
@Override
public void run() {
pBar.setProgress(current);
}
});
线程通讯
Looper:线程中的一个循环对象,主要监控该线程的消息队列MessageQueue
Looper.mylooper();得到当前线程的Looper对象
Looper.getMainLooper();得到主线程的Looper对象
MessageQueue:线程中消息的队列,由该线程对应的Handler将消息压入,由Looper取出放到该线程坏境中执行
Handler:将消息压入消息队列中
一个线程最多只有一个Looper,最多只有一个MessageQueue,可以有多个Handler
子线程自己管理Handler以及Looper
class ThreadB extends Thread {
@Override
public void run() {
super.run();
//准备Looper
Looper.prepare();
bHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e("m_tag", Thread.currentThread().getName() + " receiv msg :" + msg.obj);
}
};
//处理其他事情
//开始监听当前线程的消息队列
Looper.loop();
//尽量不要做其他事情
}
}
HandlerThread
内部已经做好Looper的管理的线程
HandlerThread ht = new HandlerThread("C");
//启动线程
ht.start();
//创建Handler
Handler h = new Handler(ht.getLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e("m_tag",Thread.currentThread().getName()+" Receive msg:"+msg.what);
}
};
发消息给HandlerThread
h.sendEmptyMessage(101);
终止HandlerThread
ht.getLooper().quit();