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 因为它是我通常通过准备循环器创建的一种消息传递线程。我想在整个应用程序生命周期中积极排队消息。当应用程序死亡时,我会让它自行退出是我的意见。