Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android服务在强制停止后继续运行_Java_Android_Multithreading_Service - Fatal编程技术网

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();