【发布时间】:2014-10-03 07:33:48
【问题描述】:
我正在尝试理解线程、处理程序、循环器。我看过视频,其中有人说每个 Android 线程都与 Looper(消息队列)相关联。所以这意味着当我创建 Thread 类实例时,它隐含地创建了它自己的 looper 连接到这个线程?或者这是错的?处理程序连接到创建它的线程,如果处理程序将发布消息的每个线程中没有循环器? 另一个问题是关于 HandlerThread 的。使用这个类的目的和优缺点是什么。 我希望你的帮助。提前谢谢大家。
编辑
例如,我想知道 Looper 是否在调用后与线程相关联
Thread myThread = new Thread();
或者您应该为调用 Looper.prepare(); 的线程明确指定 lopper;在你的线程中又隐含地创建与调用方法的线程关联的 looper 的新实例。正如我在 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 方法显式创建循环器。 我是正确的 ?请发表评论。
编辑 2
第二个例子会导致
java.lang.RuntimeException:无法在线程内创建处理程序 没有调用 Looper.prepare() 这样的异常所以结论是 只有调用 Looper.prepare() 的线程
;会有它自己的 Looper,否则在这样的线程中创建处理程序时会导致异常。
【问题讨论】:
-
大部分是对的,但你的最后一个例子没用。在调用
Looper.prepare()之后,它需要创建一个Handler并将其暴露在某个地方以便其他线程可以发布到队列中,然后调用Looper.loop()开始处理队列。正如您编写的那样,它将创建消息队列,然后什么也不做并退出。顺便说一句,虽然很高兴知道它是如何工作的,但创建自己的 Looper 的理由很少。
标签: java android multithreading