gpt4 book ai didi

java - Android的每个线程都关联着Looper(消息队列)?

转载 作者:行者123 更新时间:2023-12-02 05:33:51 25 4
gpt4 key购买 nike

我正在尝试理解线程、处理程序、循环程序。我看过视频,其中家伙说以下每个Android线程都与Looper(消息队列)相关联。那么这意味着当我创建 Thread 类实例时,它隐式地创建了自己的连接到该线程的循环器?或者这是错误的?处理程序连接到创建它的线程,如果每个线程中没有循环程序,处理程序将在其中发布消息?另一个问题是关于 HandlerThread 的。使用这个类的目的是什么,有什么优点和缺点。我希望得到您的帮助。提前感谢大家。

编辑我想知道Looper在调用后是否与线程相关联 Thread myThread = new Thread();
或者你应该为调用 Looper.prepare() 的线程显式指定 lopper;在您的线程中依次隐式创建与调用方法的线程关联的新循环实例。正如我在 Looper 类的源代码中看到的,它在准备中调用 ThreadLocal.get ,它在哪里获取当前线程。所以结论是默认情况下没有与简单线程关联的循环器?我对吗 ?而且我还注意到,Handler 的所有构造函数都调用 Handler(Callback callback, boolean async)。 Looper.myLooper();方法被调用。据我了解,这意味着遵循。

Thread myThread = new Thread(new Runnable() {
public void run() {
//some stuff here
}
});
myThread.start();

这里没有Looper与线程关联。下一个例子。

  Thread myThread = new Thread(new Runnable() {
public void run() {
Handler myHandler = new Handler();
}
});
myThread.start();

这里 Handler 在创建新的 Handler 实例时会隐式地与 Looper 关联。下一个例子。

 Thread myThread = new Thread(new Runnable() {
public void run() {
Looper.prepare();
}
});
myThread.start();

在此示例中,将通过调用prepare方法显式创建looper。我是对的 ?请评论。

编辑2

第二个例子会导致

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() such exception so conclusion is that only thread that has called Looper.prepare()

;将拥有自己的 Looper,否则在此类线程内创建处理程序时会导致异常。

最佳答案

通过调用Looper.prepare(),线程与消息队列相关联。随后在该线程中创建的任何Handler都将与同一个消息队列关联。线程通过调用 Looper.loop() 开始处理其消息队列。循环线程通常除了处理它自己的消息队列之外不会做任何事情。

关于java - Android的每个线程都关联着Looper(消息队列)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25226906/

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