这是一个关于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以便退出?还是有可能让它除了正常的监听者之外还监听时间间隔?
答案 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线程中运行,这不是您想要的。