手寫簡化版Handler消息機制流程

手寫簡化版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方法中處理該消息,這就完成了一個消息的發送和處理過程。

具體仿寫實現見https://github.com/itlgc/Framework-Handler-Exercise

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章