2011-07-24 40 views
1

我是一個小菜鳥學習Android通過一本書,我有一個快速的問題。我的書代碼非常簡單,看起來像這樣:Android,從我的書中快速提問

我的處理程序:

Handler handler=new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     bar.incrementProgressBy(5); 
       } 
    }; 

我的主題:

Thread background=new Thread(new Runnable() { 
      public void run() { 
      try { 
       for (int i=0;i<20 && isRunning.get();i++) { 
       Thread.sleep(1000); 
       handler.sendMessage(handler.obtainMessage()); 
       } 
      } 
      catch (Throwable t) { 
       // just end the background thread 
      } 
      } 
     }); 

我的問題是在這裏:

handler.sendMessage(handler.obtainMessage()); 

什麼鬼是「handler.obtainMessage()」?
在Eclipse中執行鼠標操作會給我一個消息,聽起來像是亂碼。
它試圖「獲得」什麼信息?

+0

的sendMessage應該發送一個簡單的字符串。所以我認爲obtainMessage()應該檢索你自己的常量字符串。 – papachan

回答

3

如描述的in the docs,它從消息池獲得消息而不是創建新消息。 (無論如何您都需要向處理程序發送消息):

從全局消息池中返回一條新消息。比創建和分配新實例更高效 。檢索到的消息具有 其處理程序設置爲此實例(Message.target == this)。如果你 不想要那個設施,只需調用Message.obtain()。

我會盡力闡述:

您發送一條消息給處理程序。該消息被添加到處理程序的線程隊列並在原始線程上處理。你需要給它發送一條消息,雖然你沒有在消息中使用特定的消息(根據你的處理程序代碼),所以你只需發送一條空消息,而不是爲新消息分配一個內存,消息來自消息池,這是更快。

希望這可以讓事情更清楚。

關於如何設置郵件帶有一個int:

Message m = new Message(); 
Bundle b = new Bundle(); 
b.putInt("what", 5); // for example 
m.setData(b); 
handler.sendMessage(m); 
+0

是的,這就是我通過谷歌和Eclipse(我在OP中寫的)遇到的解釋,我對它的理解太差。你能再解釋一下嗎? – Ryan

+0

@Ryan - 見編輯。 – MByD

+0

謝謝!這更有意義,我已經選擇了你的答案,但是如果你只能回答我一個相關的問題,我會很感激......現在,我沒有任何具體的消息(如你所說),我怎麼能具體的東西?我嘗試在sendmessage中發送一個int,但那不起作用... – Ryan