我需要了解Looper。Looper 将咨询适当的处理程序来发送和处理与线程的 MessageQueue 关联的消息和可运行对象。
默认情况下,线程没有与之关联的消息循环,因此也没有 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());
}
}
}
});
这是否意味着任务/可运行对象没有放入队列中? 上面的代码
与此有什么区别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
以接收来自其他Thread
的消息。您的两个示例的行为完全相同,因为您没有向第二个示例中的Thread
发送任何内容。也就是说,background3
的Looper
并没有真正被使用。
在这两个示例中,您都将Runnable
发布到为主Thread
Looper
创建的Handler
。您不是在为例如background2
创建该Handler
。该Handler
属于主Thread
及其Looper
,您发布到它的任何内容都将放入主队列,并在主Thread
上运行。
您的示例中唯一的区别是第二个Thread
有一个 Looper
,如果您愿意,您可以发布到它。为此,您需要创建另一个属于background3
Looper
的Handler
,并发布到该。但是,您没有这样做,因此第二个Thread
只是继续运行而不执行任何其他操作。
一个Thread
不需要一个Looper
来简单地发布到另一个Thread
的处理程序,这实际上是你的示例所做的一切。另一个Thread
- 主要Thread
,在这种情况下 - 已经准备好并开始Looper
.你只是向它发送Runnable
,你不需要自己的Looper
来做到这一点。