У меня есть 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
класс (я также пытался делать то, что было предложено здесь , то есть комментируемые разделы):
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
, но пока не совсем понял, для чего нужны Loopers. Передача Handler
моему ConnectThread
плохая идея?