java中的活套与没有活套的线程,以及停止活套的正确方法



我的问题是关于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创建的一种消息线程。我希望在应用程序的整个生命周期中都能积极排队发送消息。我认为,当应用程序失效时,我会让它自行退出。

相关内容

  • 没有找到相关文章

最新更新