0

我的问题是关于 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 问题后提出的

4

1 回答 1

2

在做了自己的反复试验和研究之后,我想我会分享我在 Loopers 上学到的东西。在android中,主线程已经准备好了一个looper。所以我们可以在主线程上创建一个处理程序来监听消息,而我们永远不必担心循环器。但是,如果我们像这样在主线程之外创建另一个线程作为示例:

      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();

,那么我们必须准备一个循环器,否则处理程序无法运行并且无法处理消息。处理程序需要一个活套!所以这就是我为什么在使用处理程序时没有在android主线程上调用 Looper.prepare() 的困惑,但实际上它是为我们调用的。

Looper 用于在线程之间传递消息。你永远不会在 asychTask 中使用它,因为它已经被 android 照顾好了。这就是为什么在 asynchTask onPreExecute(UI 线程)中 - 将消息发送到 doInBackground(后台线程) - 然后将消息发送到 onPostExecute(再次 UI 线程)。它使用循环器与处理程序进行消息传递。

至于退出 Looper,我认为我永远不会想要,我会让线程继续运行,因为它是我通常通过准备 Looper 创建的一种消息传递线程。我想在整个应用程序生命周期中积极地排队消息。当应用程序死亡时,我会让它自行退出是我的意见。

于 2015-12-16T21:15:35.563 回答