【发布时间】:2013-07-03 04:16:40
【问题描述】:
我不得不将 Looper 添加到以下代码中:
public class MyRunnable implements Runnable
{
@Override
public void run()
{
Looper.prepare();
final Looper looper = Looper.myLooper();
new Handler().postDelayed(
new Runnable()
{
@Override
public void run()
{
try
{
}
catch (Exception ex)
{
}
finally
{
looper.quit();
}
}
}, 100);
Looper.loop();
}
}
请注意,我在 runnable 中有一个 runnable。嵌套的 runnable 通过 Handler 执行。最初我没有 Looper,但 Android 抱怨说我需要在执行另一个线程之前调用 Looper.prepare。
我阅读了 Looper,但它似乎仍然有点神秘。它似乎就像某种内部消息传递管道。我不清楚为什么这是必要的,因为没有消息从我的外部运行到我的内部运行。即使这是真的,Android 似乎只是制定了一个硬性规则,即如果你从一个线程调用一个线程,你也必须调用 Looper.prepare。即使我按原样接受,它仍然无助于理解为什么我需要调用 looper.loop 和 looper.quit。如果我省略 Looper.loop,我的 Handler 永远不会运行,这是不清楚的。 Looper.loop 做了什么让我的 Handler 运行?
【问题讨论】:
-
android: What is the purpose of Looper and how to use it? 的可能副本。是的,如果你想使用 Looper,那么你必须调用 Looper.prepare()。使用 Looper 的替代方法包括仅创建普通(并行)线程或使用 AsyncTasks。阅读我引用的 SO 链接以获得更多背景信息。 '希望对您有所帮助...
-
有点解释它。我看到的最大问题是将 Runnables 称为“消息”。这些不是传统意义上的编程世界中的“消息”,因为 Runnable 是一段可执行的代码,而不仅仅是包含消息的数据。此外,您指向的示例甚至不包括需要的 looper.quit ,也没有表明 Looper.loop 将无限期地阻塞,直到 looper.quit 被调用。 Looper 应该被定义为一个执行多个 Runnables 的队列。