Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.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
Android工作线程未退出_Android_Multithreading - Fatal编程技术网

Android工作线程未退出

Android工作线程未退出,android,multithreading,Android,Multithreading,在一个小测试应用程序中,我有一个从thread类派生的线程。我使用它的start()方法启动它。不幸的是,当我使用stop按钮从Eclipse中停止应用程序的执行时,它似乎没有终止。我可以让线程终止的唯一方法是卸载应用程序 这正常吗?我可以通过在调试器中停止应用程序来完全停止并退出内存吗?还是我必须始终使用“干净”的方式从应用程序本身中退出?您可以通过在活动的onDestroy()或onStop()中停止线程来干净地完成此操作。要停止线程,可以在线程中保留一个标志,并在需要停止时将其打开 pub

在一个小测试应用程序中,我有一个从
thread
类派生的线程。我使用它的
start()
方法启动它。不幸的是,当我使用stop按钮从Eclipse中停止应用程序的执行时,它似乎没有终止。我可以让线程终止的唯一方法是卸载应用程序


这正常吗?我可以通过在调试器中停止应用程序来完全停止并退出内存吗?还是我必须始终使用“干净”的方式从应用程序本身中退出?

您可以通过在活动的onDestroy()或onStop()中停止线程来干净地完成此操作。要停止线程,可以在线程中保留一个标志,并在需要停止时将其打开

public void stopRunning() {
    stopped = true;
}

public void run() {
    while (!stopped) {
        try {
            // Do something
        } catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

您可以通过在活动的onDestroy()或onStop()中停止线程来干净地完成此操作。要停止线程,可以在线程中保留一个标志,并在需要停止时将其打开

public void stopRunning() {
    stopped = true;
}

public void run() {
    while (!stopped) {
        try {
            // Do something
        } catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

从Eclipse停止应用程序并不会停止应用程序在设备上运行,它只是切断Eclipse和应用程序之间的连接。与任何Java线程一样,只要JVM处于活动状态,该线程就有可能继续执行。请注意,即使您的应用程序隐藏在后台,这也并不意味着JVM已经停止。(虽然如果重新启动手机或强制关闭应用程序,它应该停止。)像Aswins这样的解决方案是最好的,但通常你会想在onPause中停止,特别是当线程保持对活动的引用时。这几乎是正确的答案。请注意,“stopped”应该声明为volatile。注意:不能保证onDestroy()会被调用,但这并不重要,因为在这种情况下,系统将杀死整个应用程序、线程和所有线程。这看起来像是在正常操作条件下如何做到的。如何在Eclipse中杀死调试器中的所有线程?从Eclipse停止应用程序并不会停止应用程序在设备上运行,它只是切断Eclipse和应用程序之间的连接。与任何Java线程一样,只要JVM处于活动状态,该线程就有可能继续执行。请注意,即使您的应用程序隐藏在后台,这也并不意味着JVM已经停止。(虽然如果重新启动手机或强制关闭应用程序,它应该停止。)像Aswins这样的解决方案是最好的,但通常你会想在onPause中停止,特别是当线程保持对活动的引用时。这几乎是正确的答案。请注意,“stopped”应该声明为volatile。注意:不能保证onDestroy()会被调用,但这并不重要,因为在这种情况下,系统将杀死整个应用程序、线程和所有线程。这看起来像是在正常操作条件下如何做到的。如何在Eclipse中杀死调试器中的所有线程;这很正常。仅仅因为您的活动线程退出,并不意味着其他线程将被终止。这也不是Android特有的问题;如果在Java应用程序中使用线程,当主线程退出时可能会出现清理问题。@EdwardFalk那么,有没有比从调试器中终止应用程序时卸载应用程序更好的解决方案?甚至设备设置中的“强制停止”似乎也不起作用。是的,请参见下面Aswin的回答。是的;这很正常。仅仅因为您的活动线程退出,并不意味着其他线程将被终止。这也不是Android特有的问题;如果在Java应用程序中使用线程,当主线程退出时可能会出现清理问题。@EdwardFalk那么,有没有比从调试器中终止应用程序时卸载应用程序更好的解决方案?甚至设备设置中的“强制停止”似乎也不起作用。是的,请参见下面Aswin的回答。