2013-05-08 56 views
1

我有一个线程来自Thread类,它在一个小测试应用程序内。我使用它的start()方法启动它。不幸的是,当我停止使用停止按钮在Eclipse中执行应用程序时,它似乎并没有终止。我可以让线程终止的唯一方法是卸载应用程序。Android工作线程不存在

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

+0

是的;这很正常。仅仅因为你的Activity线程退出了,并不意味着其他线程将被终止。这也不是Android特有的问题;如果您在Java应用程序中使用线程,则在主线程退出时可能会出现清理问题。 – 2013-05-08 02:18:21

+0

@EdwardFalk因此,当从调试器中删除应用程序时,是否有比卸载应用程序更好的解决方案?即使设备设置中的“强制停止”似乎也不起作用。 – gonzobrains 2013-05-08 02:47:21

+0

是的,请参阅下面的Aswin的答案。 – 2013-05-08 03:11:16

回答

1

您可以通过停止活动的onDestroy()或onStop()中的线程来干净地做到这一点。要停止线程,可以在线程中保留一个标志,并在要停止时打开它。

public void stopRunning() { 
    stopped = true; 
} 

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

从Eclipse停止应用程序并不会停止应用程序在设备上运行,它仅仅是切断Eclipse和应用程序之间的连接。 只要JVM处于活动状态,线程就像任何Java线程一样可以保持执行。请注意,即使您的应用程序隐藏在后台,也并不意味着JVM已停止。 (虽然它应该停止,如果你重新启动你的手机或强制杀死该应用程序。)像Aswins这样的解决方案是最好的,但通常你会想停在onPause,特别是如果线程维护对活动的引用。 – 2013-05-08 02:06:05

+1

这几乎是正确的答案。请注意,“停止”应该声明为不稳定。 – 2013-05-08 02:19:46

+0

注意:不能保证onDestroy()实际上会被调用,但它并不重要,因为在这种情况下,系统将会终止整个应用程序,线程和所有内容。 – 2013-05-08 02:20:29