我有一个Service
会产生一个Thread
以连接到第三方,并且运行良好。但是,如果我转到设置并停止该服务,它将继续运行。它从“运行服务”的设置中消失,并调用了onDestroy
方法,但是我仍然看到Service
中的每个方法都被调用。我假设我没有正确使用Thread
,但是我不明白为什么该服务会继续运行...除非在所有线程完成之前它一直运行。
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
类(我也尝试做建议的here这是已注释的部分):public class ConnectThread extends Thread {
private final Context _context;
private final Handler _handler;
// private volatile Thread runner;
public ConnectThread(Context context, Handler handler) {
super("ConnectThread");
this._context = context;
this._handler = handler;
}
// public synchronized void startThread() {
// if (runner == null) {
// runner = new Thread(this);
// runner.start();
// }
// }
//
// public synchronized void stopThread() {
// if (runner != null) {
// Thread moribund = runner;
// runner = null;
// moribund.interrupt();
// }
// }
@Override
public void run() {
Looper.prepare();
// if (Thread.currentThread() == runner) {
logger.debug("Service started");
Thread.sleep(5000); //inside try-catch
// }
Looper.loop();
}
}
当我查看DDMS时,它显示了多个
ConnectThread
,并且它们每个都处于wait
状态,因此,我假设它们正在完成并且没有被杀死,这可能会阻止我的服务停止。是否有人看到问题发生的原因,或知道如何解决?编辑:我现在开始认为这可能是因为我需要在某个地方调用
Looper.quit()
。我需要进一步阅读Looper
和Handler
。我开始看HandlerThread
,但是对于Looper的用途还不清楚。将Handler
传递给我的ConnectThread
是个坏主意吗? 最佳答案
您必须停止Looper在stopConnectThread()中循环。只是中断线程不会停止Looper。尝试这个:
在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()中而不是
_connectThread.interrupt();
中执行以下操作:_connectThread.stopLooper();