最近項目中出現一個自定義Handler,很是奇怪,原来这样做只是避免在主线程中处理事务,而自定义了一个Handler回调处理
import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
public class RunInOtherThread {
private LooperThread localThread = new LooperThread();
public Handler getHandler() {
return localThread.getHandler();
}
private class LooperThread extends Thread {
private Handler mHandler;
@SuppressLint("HandlerLeak")
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
onReceiveMessage(msg.what);
}
};
Looper.loop();
}
Handler getHandler() {
return mHandler;
}
}
public void start() {
localThread.setDaemon(true);
localThread.start();
}
public void quit(boolean isEixt) {
if(localThread != null && localThread.isAlive()){
localThread.getHandler().getLooper().quit();
localThread.interrupt();
try {
localThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(isEixt){
localThread = null;
}
}
}
public void sendMessage(int what) {
getHandler().sendEmptyMessage(what);
}
public Thread getThread() {
return localThread;
}
public void onReceiveMessage(int what) {
}
}
当然 这个Handler只能处理回调,不能进行UI和耗时操作,为了更好的理解,需要看看Thread,Looper,Handler的内在关系。
Looper解析ThreadLocal
解答:
- ThreadLocal作为中间人 定义规则ThreadLocalMap 负责取出和存储Thread的中的Looper过程
- Thread中存储一个ThreadLocalMap
- Looper中存储mQueue
- ThreadLocalMap 中存储
- Key->Thread.Name
- Value->Looper
- Looper.prepare ->ThreadLocal帮忙把Thread自己的ThreadLocalMap中的Looper 附上一个初值
- Looper.myloop-> 根据当前Thread.的name 找中间人ThreadLocal帮忙取出他自己的Looper
- Looper.loop -.>开启死循环 ,从looper->Message -> msg.target.dispatchMessage(msg);
PS: - MessageQueue:队列,先进后出。
- Message:是Handler本身。