gpt4 book ai didi

android - 调用Handler时是否需要调用Looper.prepare()

转载 作者:搜寻专家 更新时间:2023-11-01 09:45:44 24 4
gpt4 key购买 nike

我需要了解Looper。 Looper 将咨询适当的处理程序 以发送和处理与线程的 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 以接收来自其他 Thread 的消息>s。您的两个示例的行为完全相同,因为在第二个示例中您没有向 Thread 发送任何内容。也就是说,background3Looper 并没有真正被使用。

在这两个示例中,您都将 Runnable 发布到为主 ThreadLooper 创建的 Handler 。您不是为例如 background2 创建 HandlerHandler 属于主 Thread 和它的 Looper,你向它发送的任何内容都会被放入主队列,并在主线程

你的例子中唯一的区别是第二个Thread有一个Looper,如果你想,你可以发布到它.为此,您将创建另一个属于 background3LooperHandler,然后将其发送到该 Handler。不过,您并没有这样做,所以第二个 Thread 只是继续运行而没有做任何其他事情。

一个 Thread 不需要 Looper 来简单地发送到 另一个 Thread 的处理程序,它真的是你的例子所做的一切。另一个 Thread - 主 Thread,在本例中 - 已经准备好并启动了它的 Looper。您只需向它发送 Runnable,不需要您自己的 Looper 即可。

关于android - 调用Handler时是否需要调用Looper.prepare(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38236461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com