我试图了解线程,处理程序,loopers。我看过那个人说跟随每个Android线程与Looper(Message Queue)相关联的视频。这意味着当我创建Thread类实例时,它隐含地创建了自己的looper并连接到这个线程?或者这是错的?如果处理程序将发布消息的每个线程中没有looper,Handler会连接到创建它的线程吗? 另一个问题是关于HandlerThread。目的是什么以及使用这门课程的利弊是什么。 我希望得到你的帮助。谢谢大家。
修改
我想知道Looper在调用之后是否与线程相关联
Thread myThread = new Thread();
或者你应该为线程调用Looper.prepare();指定explictly lopper;在你的线程中依次隐含地创建与调用方法的线程相关联的looper的新实例。正如我在Looper类的源代码中看到的那样,它调用ThreadLocal.get来准备它获取当前线程的位置。所以结论是默认情况下没有与简单线程关联的looper?我对吗 ?
我还注意到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方法创建loooper以显式创建。 我是对的 ?请评论。
编辑2
第二个例子将导致
java.lang.RuntimeException:无法在线程内创建处理程序 没有调用Looper.prepare()这样的例外,所以结论是这样的 只有调用了Looper.prepare()
的线程
将拥有它自己的Looper,否则在这样的线程中创建处理程序时会导致异常。
答案 0 :(得分:2)
通过调用Looper.prepare()
,线程与消息队列相关联。随后在该线程中创建的任何Handler
将与同一消息队列相关联。线程通过调用Looper.loop()
开始处理其消息队列。除了处理自己的消息队列外,looper线程通常不会做任何事情。
答案 1 :(得分:0)
根据我的理解,Looper和Handler只是帮助类,可以轻松处理生成和处理线程中的消息。但除了处理消息之外,线程还可以做任何事情。