2011-07-24 86 views
4

我通過本書的學習,這讓我這個例子:如何將Runnable對象傳遞給Handler?

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(500); 
       handler.sendMessage(handler.obtainMessage()); 
      } 
     } catch (Throwable t) { 
      // just end the background thread 
     } 
    } 
}); 

哪些偉大的作品出來。但是,在書中進一步下跌,它說:

如果您不想與Message對象上做文章,你也可以通過 Runnable對象的處理程序,它會運行活動UI線程上的Runnable的 對象。 ...您可以在任何視圖(即任何小部件或容器)上使用相同的方法 。這稍微簡化了您的代碼,因爲您可以跳過處理程序對象。

但是沒有給出如何通過Runnable對象來實現這個功能的例子。有沒有人有一個例子?

回答

4

事情是這樣的:

Handler h = new Handler(); 

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

代碼更小......但我們現在有兩個run()方法嗎? – Ryan

+0

感謝這個例子,雖然已經選擇了你的答案 – Ryan

+0

現在你有兩個runnables。因此,你將有兩個run()方法。我們可以做的並不多...(但是一些代碼結構可以使它看起來稍微好一些。) –

2

作爲每Android的文檔爲Handler

公共最終布爾柱(可運行R)

自:API級別1導致了Runnable R鍵被添加到該消息 隊列。 runnable將在附加該處理程序的線程上運行。參數

r - 將被執行的Runnable。返回

如果Runnable已成功放入消息 隊列中,則返回true。失敗時返回false,通常是因爲活動處理器 消息隊列正在退出。

+0

尋找定義是通過谷歌或文檔搜索很容易。但對於像我這樣的新手來說,這些定義可能會解釋弦理論或火箭科學,這就是爲什麼我問是否有人可以舉個例子嗎?在查看代碼並將其與匹配到定義之後,更容易理解。 – Ryan