java 中的循环器与没有循环器的线程,以及停止循环器的正确方法?
loopers in java vs thread without looper, and correct way to stop looper?
我的问题是关于 java loopers 以及如何以正确的方式停止它们。
假设我有一个定义如下的线程:
class NoLooperThread extends Thread{
@Override
public void run(){
Thread.sleep(2000);
}
}
我还有另一个线程几乎相同但有一个活套:
class LooperThread extends Thread{
@Override
public void run(){
Looper.prepare();
Thread.sleep(2000);
Looper.loop();
}
}
现在如果我这样做:
new NoLooperThread().start();
我想知道这个线程在 2 秒后可能会死掉,但如果我死了:
new LooperThread().start();线程继续永远阻塞?我的假设正确吗?
以及我将如何停止此线程?我知道
我需要调用 Looper.myLooper().quit();
来停止阻塞,但最好的方法是什么?我应该通过处理程序发送消息来阻止它吗?
那么 Looper 的目的有两个:它创建一个消息队列,但也保持一个线程存活,这个假设是否也正确?
我的问题是在阅读 SO 问题后提出的 here
在进行了自己的反复试验和研究之后,我想我会分享我在活套上学到的东西。在 android 中,主线程已经准备好一个 looper。所以我们可以让一个处理程序直接在主线程上监听消息,我们永远不必担心 loopers。但是如果我们像这样在主线程之外创建另一个线程作为示例:
class LooperThread extends Thread{
int count=0;
int border=100;
@Override
public void run(){
Looper.prepare();
looperHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i("HANDLER", "MyLooperThread called");
Bundle data = msg.getData();
if (data != null) {
count++;
if (count >= border) {
mainHandler.sendEmptyMessage(count);
count = 0;
}
}
}
};
Looper.loop();
}
}
LooperThread.start();
,那么我们必须准备一个循环器,否则处理程序不能 运行 并且不能处理消息。处理程序需要一个活套!所以我很困惑为什么在使用处理程序时 Looper.prepare() 没有在 android 主线程上调用,但实际上它是为我们调用的。
Looper 用于在线程之间传递消息。你永远不会在 asychTask 中使用它,因为它已经由 android 为你处理了。这就是为什么在 asynchTask onPreExecute(UI 线程)中 - 将消息发送到 doInBackground(后台线程) - 然后将消息发送到 onPostExecute(再次 UI 线程)。它使用循环程序与处理程序传递消息。
至于退出 Looper,我认为我永远不会想要,我会离开线程 运行ning 因为它是我通常通过准备循环器创建的一种消息传递线程。我想在整个应用程序生命周期中积极排队消息。当应用程序死亡时,我会让它自行退出是我的意见。
我的问题是关于 java loopers 以及如何以正确的方式停止它们。
假设我有一个定义如下的线程:
class NoLooperThread extends Thread{
@Override
public void run(){
Thread.sleep(2000);
}
}
我还有另一个线程几乎相同但有一个活套:
class LooperThread extends Thread{
@Override
public void run(){
Looper.prepare();
Thread.sleep(2000);
Looper.loop();
}
}
现在如果我这样做:
new NoLooperThread().start();
我想知道这个线程在 2 秒后可能会死掉,但如果我死了:
new LooperThread().start();线程继续永远阻塞?我的假设正确吗?
以及我将如何停止此线程?我知道
我需要调用 Looper.myLooper().quit();
来停止阻塞,但最好的方法是什么?我应该通过处理程序发送消息来阻止它吗?
那么 Looper 的目的有两个:它创建一个消息队列,但也保持一个线程存活,这个假设是否也正确?
我的问题是在阅读 SO 问题后提出的 here
在进行了自己的反复试验和研究之后,我想我会分享我在活套上学到的东西。在 android 中,主线程已经准备好一个 looper。所以我们可以让一个处理程序直接在主线程上监听消息,我们永远不必担心 loopers。但是如果我们像这样在主线程之外创建另一个线程作为示例:
class LooperThread extends Thread{
int count=0;
int border=100;
@Override
public void run(){
Looper.prepare();
looperHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i("HANDLER", "MyLooperThread called");
Bundle data = msg.getData();
if (data != null) {
count++;
if (count >= border) {
mainHandler.sendEmptyMessage(count);
count = 0;
}
}
}
};
Looper.loop();
}
}
LooperThread.start();
,那么我们必须准备一个循环器,否则处理程序不能 运行 并且不能处理消息。处理程序需要一个活套!所以我很困惑为什么在使用处理程序时 Looper.prepare() 没有在 android 主线程上调用,但实际上它是为我们调用的。
Looper 用于在线程之间传递消息。你永远不会在 asychTask 中使用它,因为它已经由 android 为你处理了。这就是为什么在 asynchTask onPreExecute(UI 线程)中 - 将消息发送到 doInBackground(后台线程) - 然后将消息发送到 onPostExecute(再次 UI 线程)。它使用循环程序与处理程序传递消息。
至于退出 Looper,我认为我永远不会想要,我会离开线程 运行ning 因为它是我通常通过准备循环器创建的一种消息传递线程。我想在整个应用程序生命周期中积极排队消息。当应用程序死亡时,我会让它自行退出是我的意见。