何时使用handler.post()&何时使用新的Thread()

rei*_*ley 56 android android-handler android-thread

我想知道我handler.post(runnable);应该何时使用,何时使用 new Thread(runnable).start();

在Handler的开发人员文档中提到:

导致Runnable r添加到消息队列中.runnable将在连接此处理程序的线程上运行.

这是否意味着,如果我写onCreate()Activity类:

Handler handler = new Handler();
handler.post(runnable);
Run Code Online (Sandbox Code Playgroud)

然后runnable将在一个单独的线程或Activity的线程中调用?

kam*_*uel 84

您应该Handler.post()在想要在UI线程中执行操作时使用.

所以,让我们说回调(在单独的线程中运行)你想要改变一个TextView文本,你应该使用Handler.post().

在Android中,与许多其他UI框架一样,UI元素(窗口小部件)只能从主线程修改.


编辑:长时间运行任务的示例

mHandler = new Handler();

new Thread(new Runnable() {
  @Override
  public void run () {
    // Perform long-running task here
    // (like audio buffering).
    // you may want to update some progress
    // bar every second, so use handler:
    mHandler.post(new Runnable() {
     @Override
     public void run () {
       // make operation on UI - on example
       // on progress bar.
     }
    });
  }
}).start();
Run Code Online (Sandbox Code Playgroud)

当然,如果您要执行的任务非常长并且用户可能在此期间切换到其他应用程序的风险,则应考虑使用服务.

  • “在许多层面上的解释都是错误的。– T.Dimitrov”?真?毫无根据,毫无用处的评论。你的证明在哪里? (4认同)
  • @ T.Dimitrov您可能想更清楚地了解此处的解释到底出了什么问题,否则没人会知道您的意思。 (2认同)

par*_*oel 26

为了回答你的具体问题:

这是否意味着如果在我写的onCreate of Activity类中:

处理程序处理程序= new Handler()hanlder.post(runnable); 那么,runnable将在一个单独的线程中调用还是在Activity的线程上调用?

不,它不会.Runnable将在主线程本身上调用.Handler仅用于将消息发布到它所附加的线程(创建它的位置).它不会自己创建一个线程.在您的示例中,您在主Thread(调用Activity.OnCreate()的位置)中创建了一个Handler,因此在此类Handler上发布的任何消息都将仅在主线程上运行.

  • 正确答案并不总是被选为最佳答案.谢谢 (3认同)

wor*_*ked 12

举例:

mHandler = new Handler();
new Thread(new Runnable(){
  @Override
  public void run () {
    mHandler.post(new Runnable() {
     @Override
     public void run () {
       mUiView.setX(x);
     }
    });
  }
}).start();
Run Code Online (Sandbox Code Playgroud)

或者,您可以跳过处理程序并直接在视图上使用post方法:

new Thread(new Runnable(){
  @Override
  public void run () {
    mUiView.post(new Runnable() {
     @Override
     public void run () {
       mUiView.setX(x);
     }
    });
  }
}).start();
Run Code Online (Sandbox Code Playgroud)

这是一个很好的帖子,概述了差异:post方法究竟做了什么?


小智 6

使用handler.post()时要发布的代码(通常是从后台线程)主线程。是的,就像您一样,发帖给别人。借助处理程序,代码将尽快执行,即几乎立即执行。