这是一个关于如何在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来退出它?或者,除了正常的listenes之外,是否有可能让它监听时间间隔?
我稍微更改了您的代码示例。你可以这样退出looper:
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();
}
}
但是我猜这个looper什么也没做,因为它的消息队列没有接收到任何消息。侦听器可能正在UI线程中运行,我想这不是您想要的。