手寫簡化版Handler消息機制流程
代碼地址:https://github.com/itlgc/Framework-Handler-Exercise
ThreadLocal工作原理
ThreadLocal 是一個線程內部的數據存儲類。不同的線程訪問同一個ThreadLocal,不管是調用它的set還是get方法,它們對ThreadLocal的讀寫操作僅限於各自線程內部
在Handler中用它來存儲Looper來保證它在線程中的唯一性
//ThreadLocal 線程內部的存儲類
final ThreadLocal<String> threadLocal = new ThreadLocal<String>(){
@Nullable
@Override
protected String initialValue() {
//重寫初始化方法,默認返回null
return "我是重寫初始化返回值";
}
};
System.out.println("主線程threadLocal:" + threadLocal.get());
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
String value1 = threadLocal.get();
System.out.println("thread-1:" + value1);
//數據存儲以後,只有再指定線程中可以獲取到存儲的數據,對於其他線程來說則無法獲取到數據。
threadLocal.set("我是thread1設置後的值");
String value2 = threadLocal.get();
System.out.println("thread-1:" + value2);
//避免佔用大量無意義的內存佔用
threadLocal.remove();
}
});
thread1.start();
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
String value1 = threadLocal.get();
System.out.println("thread-2:" + value1);
threadLocal.set("我是thread2設置後的值");
String value2 = threadLocal.get();
System.out.println("thread-2:" + value2);
//避免佔用大量無意義的內存佔用
threadLocal.remove();
}
});
thread2.start();
}
日誌打印:
主線程threadLocal:我是重寫初始化返回值
thread-1:我是重寫初始化返回值
thread-1:我是thread1設置後的值
thread-2:我是重寫初始化返回值
thread-2:我是thread2設置後的值
Android消息機制模型
模型的解釋:
1.以Handler的sendMessage方法爲例,當發送一個消息後,會將此消息加入消息隊列MessageQueue中。
2.Looper負責去遍歷消息隊列並且將隊列中的消息分發給對應的Handler進行處理。
3.在Handler的handleMessage方法中處理該消息,這就完成了一個消息的發送和處理過程。