Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 異步消息處理機制-Android中Handler原理(續)

異步消息處理機制-Android中Handler原理(續)

編輯:關於Android編程

異步消息處理線程是指線程啟動後會進入一個無限循環,每循環一次,從內部的消息隊列裡面取出一個消息,並回調相應的消息處理函數。一般在任務常駐,比如用戶交互任務的情況下使用異步消息處理線程。

之前在Android中Handler原理裡面研究過android裡實現異步消息處理線程的方式,基本邏輯如圖所示
這裡寫圖片描述
今天就用java將其簡單的模擬出來加深印象,下面的類圖是用工具導出的,不太正規,不過能大概看出類之間的關系
這裡寫圖片描述

Message類:消息類<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> public class Message { public int what; public Object obj; public Handler target; }

Looper類:用來將普通的線程變為異步消息循環的類,維護了一個消息隊列。每個線程有且僅有Looper對象,且是線程封閉的,每個線程都有自己的一份拷貝。

public class Looper {

    private MessageQueue queue;
    private static final ThreadLocal sThreadLocal = new ThreadLocal();

    public Looper() {
        queue = new MessageQueue();
    }

    public static void prepare(){
        if (sThreadLocal.get() != null) {
            throw new RuntimeException(Only one Looper can be created per thread);
        }
        sThreadLocal.set(new Looper());
    }

    public static Looper myLooper() {
        return sThreadLocal.get();
    }

    public static MessageQueue myQueue() {
        return myLooper().queue;
    }

    public static void loop(){
        while(true){
            Message msg = myQueue().deQueueMessage();
            if (msg == null) {
                continue;
            }else {
                msg.target.dispatchMessage(msg);
            }
        }
    }
}

MessageQueue 類:消息隊列,按照先進先出的原則從隊列裡面取出消息Message

public class MessageQueue {

    private Queue queue = new LinkedList();

    public synchronized void enqueueMessage(Message msg){
        queue.offer(msg);
    }

    public synchronized Message deQueueMessage(){
        if (queue.isEmpty()) {
            return null;
        }
        return queue.poll();
    }   
}

Handler類:一般不直接操作隊列,通過handler往消息隊列裡面加入Message對象。並且暴露handlerMessage方法讓程序員重寫達到自己的處理的目的。

public class Handler {

    private MessageQueue queue;
    public Handler(){
        queue = Looper.myQueue();
    }

    public void sendMessage(Message msg){
        msg.target = this;
        queue.enqueueMessage(msg);
    }


    public void dispatchMessage(Message msg) {
        handleMessage(msg);
    }

    public void handleMessage(Message msg){}

}

Main 類:程序運行的啟動類

public class Main {

    public static void main(String[] args) {

        Looper.prepare();
        TestInterface test = new Test();
        test.onCreate();
        Looper.loop();
    }
}

TestInfo接口:規范了測試的一個接口

public interface TestInterface {

    void onCreate();
}

Test 類:暴露出來的唯一的需要程序員填寫代碼的類我們在一個定時器裡面每一秒鐘發送一條消息到主線程,並將其顯示出來

public class Test implements TestInterface{

    private static SimpleDateFormat sdf=new SimpleDateFormat(HH:mm:ss);

    private Handler handler = new Handler(){
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
                System.out.println(handler---> + (String)msg.obj);
            }
        };
    };

    @Override
    public void onCreate() {
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                Message msg = new Message();
                msg.what = 1;
                msg.obj = test + sdf.format(new Date());
                handler.sendMessage(msg);
            }
        }, 0,1000);
    }
}

測試結果如下:

handler—>test21:32:43
handler—>test21:32:44
handler—>test21:32:45
handler—>test21:32:46
handler—>test21:32:47
handler—>test21:32:48
handler—>test21:32:49
…….

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved