Android中的Handler-Looper实现
Posted
技术标签:
【中文标题】Android中的Handler-Looper实现【英文标题】:Handler-Looper implementation in Android 【发布时间】:2011-07-16 01:00:12 【问题描述】:-
我有带有处理程序的活动(UI 线程)
我启动新线程并制作 handler.post(new MyRunnable()) - (new work thread)
android 文档中提到了 post 方法:“导致 Runnable r 被添加到消息队列中。runnable 将在附加此处理程序的线程上运行。”
处理程序附加到 UI 线程。 android如何在不创建新线程的情况下在同一个UI线程中运行runnable?
是否会使用来自 handler.post() 的 Runnable 创建新线程? 还是只会从 Runnable 子类调用 run() 方法?
【问题讨论】:
【参考方案1】:这是一个关于如何使用处理程序的粗略伪代码示例 - 我希望它有所帮助:)
class MyActivity extends Activity
private Handler mHandler = new Handler();
private Runnable updateUI = new Runnable()
public void run()
//Do UI changes (or anything that requires UI thread) here
;
Button doSomeWorkButton = findSomeView();
public void onCreate()
doSomeWorkButton.addClickListener(new ClickListener()
//Someone just clicked the work button!
//This is too much work for the UI thread, so we'll start a new thread.
Thread doSomeWork = new Thread( new Runnable()
public void run()
//Work goes here. Werk, werk.
//...
//...
//Job done! Time to update UI...but I'm not the UI thread! :(
//So, let's alert the UI thread:
mHandler.post(updateUI);
//UI thread will eventually call the run() method of the "updateUI" object.
);
doSomeWork.start();
);
【讨论】:
所以UI线程只调用“updateUI”对象的run()方法?并且UI线程不会创建新线程并调用start()在新线程中做run()方法代码? 据我了解,这是正确的。 (CommonsWare 似乎在上面说同样的话,而且他说话很有权威。xD) @Cephron :OP 试图说,当您创建可运行对象时,它的 run 方法将由单独的线程运行。那么如何在 UI 线程中运行该任务。因为当你调用runnable.start()时,会创建一个新线程对吗? @Ashwin:我不这么认为......当你创建一个新的 Thread 对象并调用 thread.start() 时,就会创建一个新线程。您通常使用 Runnable 初始化一个新的 Thread 对象,但您也可以使用 Runnable 做其他事情——比如将它们发布到 Handler。【参考方案2】:处理程序附加到 UI 线程。
正确。
android如何在不创建新线程的情况下在同一个UI线程中运行runnable?
任何线程,包括主应用程序(“UI”)线程,都可以在Handler
(或任何View
,就此而言)调用post()。
【讨论】:
是否会使用来自 handler.post() 的 Runnable 创建新线程?那么带有runnable的消息将从队列中取出并启动新线程吗?我不明白“runnable 将在此处理程序所附加的线程上运行”是什么意思。 runnable 如何在不创建新线程的情况下在同一个线程中运行? @androidev Alex:不。每个应用程序只有一个主应用程序(“UI”)线程。post()
将在该线程上运行您的 Runnable
。
@androidev Alex:我想是的,但老实说,我不完全理解你的问题。
@CommonsWare :OP 试图说,当您创建可运行对象时,它的 run 方法将由单独的线程运行。那么如何在 UI 线程中运行该任务。因为当你调用runnable.start()时,会创建一个新线程对吗?
@Ashwin:“OP 试图说,当你创建一个可运行对象时,它的 run 方法将由一个单独的线程运行。” ——这是不正确的。 Runnable
可以在单独的线程中运行;它不会自动在单独的线程中运行。 “因为当你调用 runnable.start() 时,会创建一个新线程,对吧?” - 不。这是标准的 Java,过去 15 年左右它的行为方式。以上是关于Android中的Handler-Looper实现的主要内容,如果未能解决你的问题,请参考以下文章