相关疑难解决方法(0)

更新GUI:Runnables vs Messages

要从其他线程更新GUI,基本上有两种主要方法:

  1. 将java.lang.Runnable与以下任何方法一起使用:

    Activity.runOnUiThread(Runnable)
    View.post(Runnable)
    View.postDelayed(Runnable, long)
    Handler.post(Runnable)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用android.os.Message:

    Handler.sendMessage(Message) / Handler.handleMessage(Message)
    
    Run Code Online (Sandbox Code Playgroud)

您也可以使用AsyncTask,但我的问题更侧重于更新非常简单的组件的用例.让我们看看如何使用这两种方法完成:

  1. 使用Runnables:

    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), ...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用消息:

    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?
        }
    
    Run Code Online (Sandbox Code Playgroud)

恕我直言,消息不是要走的路,因为:

  • 对于新的非android程序员来说并不容易理解(在构造期间处理程序挂钩到它的线程).
  • 如果消息跨越进程边界,则对象有效负载应为Parcellable.
  • 消息被重用(如果没有正确清理,则容易出错?)
  • 处理程序具有双重角色(它发送消息,但也处理它们)
  • 消息属性是公共的,但也提供getter/setter.

另一方面,Runnables遵循众所周知的命令模式,并且更加程序员友好且可读.

那么使用Messages …

user-interface android message runnable

46
推荐指数
3
解决办法
8845
查看次数

标签 统计

android ×1

message ×1

runnable ×1

user-interface ×1