Служба Android продолжает работать после принудительной остановки - PullRequest
1 голос
/ 29 марта 2011

У меня есть 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 плохая идея?

1 Ответ

0 голосов
/ 24 мая 2012

Вы должны остановить цикл Looper в stopConnectThread ().Простое прерывание Нити не остановит Лупера.Попробуйте это:

в классе ConnectThread add:

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() add:

myLooper = Looper.myLooper(); // Get the Looper associated with this Thread

в stopConnectThread ()вместо _connectThread.interrupt(); сделайте это:

_connectThread.stopLooper();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...