何时使用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,就像你一样,给别人写信。 在处理程序的帮助下,代码将尽快执行即时。