Java Android服务在强制停止后继续运行
我有一个Java Android服务在强制停止后继续运行,java,android,multithreading,service,Java,Android,Multithreading,Service,我有一个服务,它生成了一个线程来连接到第三方,并且运行良好。但是,如果我转到“设置”并停止该服务,它将继续运行。它从设置中运行的服务中消失,并且调用了ondestory方法,但我仍然看到调用服务中的每个方法。我假设我没有正确使用线程,但我不明白为什么服务会继续运行。。。除非它一直运行直到所有线程都完成 public class DataProcessorService extends Service { private ServiceState _state; private
服务
,它生成了一个线程
来连接到第三方,并且运行良好。但是,如果我转到“设置”并停止该服务,它将继续运行。它从设置中运行的服务中消失,并且调用了ondestory
方法,但我仍然看到调用服务中的每个方法。我假设我没有正确使用线程
,但我不明白为什么服务会继续运行。。。除非它一直运行直到所有线程都完成
public class DataProcessorService extends Service {
private ServiceState _state;
private ConnectThread _connectThread;
private Handler _handler = new Handler() {
public synchronized void handleMessage(Message msg) {
stopConnectThread();
onNextState(); // Goes to state after Connecting
}
};
@Override
public void onCreate() {
logger.debug("onCreate called");
_state = ServiceState.readState(this);
switch (_state) {
...
case CONNECTING:
onConnecting();
break;
...
}
}
@Override
public void onDestroy() {
logger.debug("onDestroy called");
stopConnectThread();
ServiceState.saveState(this, _state);
}
private void onConnecting() {
_state = ServiceState.CONNECTING;
logger.debug("onConnecting called");
_connectThread = new ConnectThread(this, _handler);
_connectThread.setDaemon(true);
_connectThread.start();
}
private void stopConnectThread() {
if (_connectThread != null) {
_connectThread.interrupt();
_connectThread = null;
}
}
}
下面是我的ConnectThread
类(我还尝试了建议的操作,即注释部分):
当我查看DDMS时,它会显示多个ConnectThread
s,并且它们都处于wait
状态,因此我假设它们正在完成并且没有被终止,这可能会阻止我的服务停止。有人知道问题发生的原因,或者知道如何解决吗
编辑:我现在开始认为这可能是因为我需要一个Looper.quit()
调用某个地方。我需要阅读活套
和处理程序
更多信息。我开始研究HandlerThread
,但我还不太清楚活套的用途。将处理程序
传递给我的连接线程
是个坏主意吗?您必须阻止循环器在stopConnectThread()中循环。只是打断线程并不能阻止活套。试试这个:
在ConnectThread类中添加:
private Looper myLooper; // A reference to the Looper for this Thread
public void stopLooper() {
// Tell Looper to stop looping
myLooper.quit();
}
在ConnectThread.run()方法中,在Looper.prepare()之后添加:
myLooper = Looper.myLooper(); // Get the Looper associated with this Thread
在stopConnectThread()中,而不是\u connectThread.interrupt()代码>执行以下操作:
_connectThread.stopLooper();
_connectThread.stopLooper();