我的问题是关于java循环器,以及如何以正确的方式停止它们。
假设我有一个线程定义如下:
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问题之后提出的
在做了自己的试错和研究之后,我想分享我在loopers上学到的东西。在android中,主线程已经准备好了一个活套。因此,我们可以制作一个处理程序来侦听主线程上的消息,而不必担心循环器。但是,如果我们在主线程之外制作另一个线程,例如:
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();
,那么我们必须准备一个活套,否则处理程序无法运行,也无法处理消息。处理程序需要一个活套!这就是我的困惑,为什么在使用handler时没有在android主线程上调用Looper.prepare(),但实际上它是为我们调用的
Looper用于在线程之间传递消息。你永远不会在asychTask中使用它,因为它已经被android照顾好了。这就是为什么在异步任务onPreExecute(UI线程)中,将消息发送到doInBackground(后台线程),后者随后将消息发送给onPostExecute(再次发送UI线程)。它使用looper与处理程序进行消息传递。
至于退出Looper,我想我永远都不想退出,我会让线程运行,因为这是我通常通过准备Looper创建的一种消息线程。我希望在应用程序的整个生命周期中都能积极排队发送消息。我认为,当应用程序失效时,我会让它自行退出。