退出线程的弯针

时间:2018-07-24 15:57:32

标签: android multithreading android-looper

这是一个关于Android中如何处理线程和循环程序的更一般的问题,因此代码有些泛化。

请考虑以下课程DoSomethingClass,该课程必须开始某种需要侦听事件的操作(例如蜂窝rssi更改,位置更改等)。

public class DoSomethingClass {
    private Thread listenForSomethingThread;

    private void startDoingSomething() {
        listenForSomethingThread = new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();
                SomethingListener listener = new SomethingListener() {
                    @Override
                    public void onSomethingHappened(Something something) {
                        // Quit looper if interrupted
                        if (Thread.currentThread().isInterrupted()) {
                            Looper.myLooper().quit();
                        } else {
                            // Do stuff with the Something if not                           
                        }
                    }
                }

                SomethingManager somMan = // Retrieve it
                somMan.requestSomethingUpdates(listener);
                Looper.loop();  // Blocks until Looper is quitted
                somMan.removeSomethingUpdates(listener);                
            }
        });
        listenForSomethingThread.start();
    }

    private void stopDoingSomething() {
        listenForSomethingThread.interrupt();
    }
}

非常简单:当我调用startDoingSomething()时,会产生一个新的线程,该线程创建一个侦听器来侦听事件并进行处理(例如,记录日志,对呼叫者自动喊叫等)。为此,它准备并启动一个弯针。

完成后,我调用stopDoingSomething(),这会中断线程:在下一个事件中,将不会执行任何操作,但是线程将清理并终止。

这是问题所在:如果该事件从不发生,该怎么办?这样一来,就不会调用中断检查功能,而循环程序也不会退出,并且会永远循环!

是否有任何方法可以从另一个线程获取线程的Looper以便退出?还是有可能让它除了正常的监听者之外还监听时间间隔?

1 个答案:

答案 0 :(得分:0)

我稍微更改了您的代码示例。您可以这样退出循环播放器:

public class DoSomethingClass {
    private Thread listenForSomethingThread;
    private Looper looper; // create this field

    private void startDoingSomething() {
        listenForSomethingThread = new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();
                looper = Looper.myLooper(); // store the looper here
                SomethingListener listener = new SomethingListener() {
                    @Override
                    public void onSomethingHappened(Something something) {
                        // Quit looper if interrupted
                        if (Thread.currentThread().isInterrupted()) {
                            Looper.myLooper().quit();
                        } else {
                            // Do stuff with the Something if not                           
                        }
                    }
                }

                SomethingManager somMan = // Retrieve it
                somMan.requestSomethingUpdates(listener);
                Looper.loop();  // Blocks until Looper is quitted
                somMan.removeSomethingUpdates(listener);                
            }
        });
        listenForSomethingThread.start();
    }

    private void stopDoingSomething() {
        looper.quit(); // quit the looper
        listenForSomethingThread.interrupt();
    }
}

但是我想这个循环程序没有做任何事情,因为它的消息队列没有收到任何消息。我认为,侦听器可能正在UI线程中运行,这不是您想要的。