【发布时间】:2016-11-09 05:45:59
【问题描述】:
我需要了解 Looper。 Looper 将咨询适当的 handler 来发送和处理与线程的 MessageQueue 关联的 Message 和 Runnable 对象。
默认情况下,线程没有与之关联的消息循环,因此也没有 Looper。要为某个线程创建 Looper 并专用于该线程以串行方式处理来自消息循环的消息,您可以使用 Looper 类。
以下是我没有显式调用 Looper 的代码
Thread background2 = new Thread(new Runnable() {
@Override
public void run() {
for ( int i = 0; i < 5; i++) {
final int v =i;
try { Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
txt.setText(txt.getText() + "Thread 2 current i : " + String.valueOf(v) +System.getProperty("line.separator"));
}
});
} catch (Exception e) {
Log.v("Error", e.toString());
}
}
}
});
是不是表示task/runnable没有放入队列?上面的代码和这个有什么区别
Thread background3 = new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
for ( int i = 0; i < 5; i++) {
final int v =i;
try { Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
txt.setText(txt.getText()+ "Thread 3 set : " + String.valueOf(v) +System.getProperty("line.separator"));
}
});
} catch (Exception e) {
Log.v("Error", e.toString());
}
}
Looper.loop();
}
});
他们都访问一个相同的处理程序。它们都工作正常。
【问题讨论】:
-
一个
Thread不需要Looper来发布到另一个Thread的Handler,如果这就是你要问的。您的示例中的Handlers 用于其他Threads,无论您在哪个Threads 上创建它们。 -
你好,我现在很困惑,所以我的第二个例子有什么区别,我明确地调用 Looper.prepare(),但没有它,它仍然有效
-
为
Thread创建一个Looper意味着其他Threads 可以向其发帖。您示例中的Looper并没有真正做任何事情,因为您没有向在那里创建的Handler发布任何内容,这就是您看不到差异的原因。 -
迈克,
that other Threads can post to it在这种情况下是什么?你能把它作为答案吗, -
嗯,这里有很多答案已经涵盖了这一点,所以我宁愿找到一个重复的答案而不是发布一个重复的答案。无论如何,在您的第二个示例中,由于您在那个
Thread中开始一个Looper,您可以为那个Looper创建一个Handler,将它传递给另一个Thread,然后传递给另一个Thread可以发布到它。您的示例Threads 将Runnables 发布到为Handlers 创建的任何其他Thread。他们不会将它们发布给自己。
标签: android multithreading android-looper