要更新從其他線程的GUI,基本上有兩種主要的方法:更新GUI:VS的Runnable消息
使用了java.lang.Runnable與任何這些方法:
Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long) Handler.post(Runnable)
使用android.os.Message:
Handler.sendMessage(Message)/Handler.handleMessage(Message)
您也可以使用AsyncTask,但我的問題更多集中在更新非常簡單的組件的用例上。讓我們來看看它是如何將使用來完成這兩種方法:
使用的Runnable:
TextViev tv = ...; final String data = "hello"; Runnable r = new Runnable() { @Override public void run(){ tv.setText(data); } }; //Now call Activity.runOnUiThread(r) or handler.post(r), ...
使用的消息:
Message m = handler.obtainMessage(UPDATE_TEXT_VIEW, "hello"); handler.sendMessage(m); //Now on handler implementation: @Override public void handleMessage(Message msg) { if(msg.what == UPDATE_TEXT_VIEW){ String s = (String) msg.obj; tv.setText(data); } ... //other IFs? }
恕我直言,消息是沒有辦法的辦法,以因爲:
- 不容易理解新的非android程序員(處理程序掛鉤到其線程在建設過程中)。
- 如果消息跨越進程邊界,則對象有效內容應該是可包裝的。
- 消息被重複使用(容易出錯,如果不妥善清理?)
- 該處理器具有雙重作用(其發送的消息,同時也處理它們)
- 信息屬性是公開的,而且還提供了getter/setter。
另一方面,Runnables遵循衆所周知的命令模式,並且程序員更友好,更易讀。
那麼使用消息超過Runnables有什麼優勢?在現代Android編程中,消息是否被推入了背景?使用Runnables無法完成的消息有什麼可以做的嗎?
在此先感謝。
好吧,也許這個想法沒有清楚地暴露在我的問題。它不是Handler vs Runnables,而是Handler.sendMessage與Runnable的替代品。 (該組還包括'Handler.postDelayed'和'Handler.postAtTime',其中包含#1) –
您實際上已在您的帖子中解釋了差異。我不知道我可以添加到這些的任何其他差異。 – Caner