2011-01-10 57 views
2

我想知道處理程序是如何在Android/DalvikVM中處理的。我正在爲Android編寫一個應用程序,並且在一個類中我有一個Handler方法,它接收來自另一個類的消息。 Handler方法是作爲一個線程運行,並且與同一個類中的run()方法是異步的,還是等待run()方法中的一行代碼完成(原子操作)?或者是其他東西?Android/DalvikVM進程處理程序如何?

我想知道,因爲我想在Handler方法中將消息添加到隊列中,並在run()方法(生產者 - 消費者)中處理並刪除它們。

我的代碼結構:

public class Parser implements Runnable { 
    public void run() { 
      while(true) { 
      // Remove a byte from the ring buffer and parse it 
      byte b = Ringbuffer_read(); 
      // Parse 
     try { 
       Thread.sleep(40); 
      } catch (InterruptedException e) {} 
      } 
    } 

    private final Handler mHandler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case MESSAGE_READ: 
       // Store all the received bytes in the ring buffer 
       for (int i = 0; i < msg.arg1; i++) { 
        Ringbuffer_store(((byte[]) msg.obj)[i]); 
       } 
       break; 
      } 
     } 
    }; 
} 

時候會在處理程序的代碼運行嗎?它在任何時候都會中斷run()方法中的代碼嗎?我是否必須在run()和handler方法中有一些同步或信號量或代碼,以便我不會損壞緩衝區?

回答

4

Android Handler將自己與創建的任何線程關聯(假設線程已經有活套)。默認情況下,Android回調會在名爲「main」的線程上運行,該線程也稱爲ui線程。無論從handleMessage方法中調用post方法的哪個線程都將從處理程序創建的線程(通常是「主」線程)中調用。由於handleMessage方法總是在同一個線程中調用,因此一次只能處理一條消息。

如果您的計劃是隻有一個消費者,那麼Handler是一個不錯的選擇。您不需要從您的消費者(處理程序)中刪除消息,而是隻需到達handleMessage進行處理。如果要在「主」線程上執行處理,則只需創建一個新的處理程序,如果要在後臺執行處理以避免ANR,則可能需要使用HandlerThread。這裏有它自己的後臺線程運行的處理程序的一個例子:

HandlerThread handlerThread = new HandlerThread("Consumer"); 
handlerThread.start(); 
Handler consumer = new Handler(handlerThread.getLooper()) { 
    public void handleMessage (Message msg) { 
    } 
}; 

請注意,在上面的類的描述不發揮作用,因爲在所有類代碼是如何組織是無關的代碼是什麼線程執行。

相關問題