歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android中的MessageHandler機制

總體思想就是兩個(多個)線程共享一塊存儲區域,它們並發地操作這塊內存。

下面是我自己初步寫的模擬程序。

這裡僅貼上Hander, HandlerThread, Looper2

package com.zte.liu;

public class Handler {
 
 private Looper2 looper = null;
 
 public Handler(Looper2 looper){
  this.looper = looper;
 }

 public Message obtainMessage(){
  return new Message(this);
 }
 
 public Message obtainMessage(int id){
  return new Message(id, this);
 }
 
 public void dispatchMsg(Message msg){
  handleMessage(msg);
 }
 
 public Looper2 getLooper(){
  return looper;
 }
 
 public void handleMessage(Message msg){//鉤子函數
  System.out.println(msg.getId());
 }
}

 

 

public class HandlerThread implements Runnable{
 
 public void run(){
  Looper2.prepare();
  Looper2.loop();
 }

}

 

 

package com.zte.liu;

public class Looper2 {

 private static Looper2 looper = null;
 private MessageQueue<Message> mQueue;
 private Looper2(){
  mQueue = new MessageQueue();
 }
 
 public static void prepare(){
  if(looper == null){
   looper = new Looper2();
  }
 }
 
 public static Looper2 myLooper(){
  prepare();
  return looper;
 }
 
 public MessageQueue<Message> getQueue(){
  return mQueue;
 }
 
 public static final void loop(){
  System.out.println("loop begin...");
  Looper2 looper = myLooper();
  MessageQueue<Message> queue = looper.mQueue;
  if(looper == null) {
   return;
  }
  while(true){
   System.out.println("----queue size ="+queue.size());
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   Message msg = (Message)queue.next();
   if(msg != null){
    if(msg.getHandler() == null)return;
    else{
     msg.getHandler().dispatchMsg(msg);
     Message.recycle(msg);
    }
   }
  }
 }
}

Copyright © Linux教程網 All Rights Reserved