何时使用handler.post()和何时新的线程()

我想知道什么时候应该使用handler.post(runnable); 什么时候应该使用new Thread(runnable).start();

在Handler的开发者文档中提到:

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

这是否意味着如果我写在Activity类的onCreate()

 Handler handler = new Handler(); handler.post(runnable); 

那么runnable将在一个单独的线程或在Activity的线程中被调用?

每当你想在UI线程中执行操作时,你应该使用Handler.post()

所以,让我们说在callback(这是运行在单独的线程),你想改变一个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(); 

当然,如果您要执行的任务时间很长,并且存在用户可能同时切换到另一个应用程序的风险,则应考虑使用服务 。

为了回答你的具体问题:

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

Handler handler = new Handler()hanlder.post(runnable); 那么,runnable将在一个单独的线程或在Activity的线程中被调用?

不,不会的。 Runnable将在主线程上被调用。 处理程序只是简单地用于发送消息到它所连接的线程(它被创build的地方)。 它不会自行创build线程。 在你的例子中,你在主线程(在Activity.OnCreate()被调用的地方)创build了一个Handler,因此任何发布在这个Handler上的消息都只会在主线程上运行。

举例说明:

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

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

 new Thread(new Runnable(){ @Override public void run () { mUiView.post(new Runnable() { @Override public void run () { mUiView.setX(x); } }); } }).start(); 

这是一个很好的post,概述了差异: post方法到底是什么?

当你想把代码(通常是从后台线程)发布主线程时,使用handler.post() 。 是啊,POST,就像你一样,给别人写信。 在处理程序的帮助下,代码将尽快执行即时。