当在一个非activity或thread类中创建handle的时候,例如Call中。因为传入Handler的需要是主线程的looper。
如果你不带参数的实例化:Handler handler = new Handler();那么这个会默认用当前线程的looper。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
一个looper对应一个handler。
image.png
由于无法保证Call 的当前运行线程的looper是否为主线程(call的使用场景有2种,打电话和接电话,接电话的时候,调用call的线程不是主线程),所以在源码中call的handler的创建传入的是Looper.getMainLooper()。
package com.android.server.telecom;
public class Call implements CreateConnectionResponse, EventManager.Loggable {
private final Handler mHandler = new Handler(Looper.getMainLooper());
}
但是如果非要创建一个不带looper参数的Handler,并且不方便加Looper的话,就要在创建之前加上判断条件,确保只有当前线程是主线程的时候才创建该handler。
即
Handler handler;
if (Looper.myLooper() == Looper.getMainLooper()) {
handler = new Handler();
}
参考链接:
Looper.getMainLooper()
Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别
网友评论