要从其他线程更新 GUI,基本上有两种主要方法:
将 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,但我的问题更侧重于更新一个非常简单的组件的用例。让我们看看如何使用这两种方法来完成:
使用可运行文件:
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 程序员来说不容易理解(在构造过程中处理程序挂钩到其线程)。
- 如果消息跨越进程边界,则对象有效负载应该是 Parcellable。
- 消息被重用(如果没有正确清理容易出错?)
- 处理程序具有双重作用(它发送消息,但也处理它们)
- 消息属性是公开的,但也提供 getter/setter。
另一方面,Runnables 遵循众所周知的命令模式,并且对程序员更加友好和可读。
那么使用 Messages 而不是 Runnables 有什么优势呢?在现代 Android 编程中,消息是否被推到了后台?有什么可以用 Runnables 做不到的 Messages 做的吗?
提前致谢。