Looper、Handler在子執行緒中的應用
阿新 • • 發佈:2019-01-06
Looper類:為一個執行緒開啟一個訊息迴圈,裡面有一個訊息佇列,新執行緒是沒有開啟訊息迴圈的,所以需要用到Looper的方法建立訊息迴圈(主執行緒除外,主執行緒會自動為其建立Looper物件,開啟訊息迴圈),MessageQueue存放訊息和事件
Handler類:輔助類,向繫結的Looper投遞訊息
Looper原型:
Looper.prepare()
Looper.loop
Looper.quit
程式碼:
- package com.test.looper;
- import android.app.Activity;
- import android.os.Bundle;
-
import
- import android.os.Looper;
- import android.os.Message;
- import android.util.Log;
- publicclass MainActivity extends Activity {
- private LooperThread looperThread;
- @Override
- publicvoid onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- looperThread = new LooperThread();
- looperThread.start();
- looperThread.getHandler().sendEmptyMessage(1);
- }
- class LooperThread extends Thread {
- private Handler mHandler;
-
privatefinal Object mSync = new
- publicvoid run() {
- Looper.prepare();
- synchronized (mSync) {
- mHandler = new Handler(){
- @Override
- publicvoid handleMessage(Message msg) {
- Log.d("CYQ", "--->" + msg);
- }
- };
- mSync.notifyAll();
- }
- Looper.loop();
- }
- public Handler getHandler() {
- synchronized (mSync) {
- if (mHandler == null) {
- try {
- mSync.wait();
- } catch (InterruptedException e) {
- }
- }
- return mHandler;
- }
- }
- publicvoid exit() {
- getHandler().post(new Runnable(){
- publicvoid run() {
- Looper.myLooper().quit();
- }});
- }
- }
- }
1、new Handler()必須在子執行緒的run方法中,否則不是子執行緒的Handler
2、在getHandler方法中,我加入了同步,防止執行緒start了,但是並沒有run結束,若此時直接返回mHandler會是一個null(不行可以試試,我一開始鬱悶許久,最後在原始碼中發現有更穩定的實現,所以效仿了,
後記:
看來原始碼還是寫得很健壯的,仍需多加學習!
總結一下(也許不對,請懷疑):
一個執行緒有一個對應的Looper,這個Looper就是訊息迴圈,我理解就是提供了一個訊息迴圈的場所,但是訊息的投遞,訊息的處理它不做,它會繫結一個Handler,然後Handler去投遞和處理訊息,一個執行緒中實現handleMessage,另外一個執行緒就可以sendMessage,執行緒可以主或者子,進而實現執行緒間訊息的傳遞。