【问题标题】:stop thread on exiting app在退出应用程序时停止线程
【发布时间】:2012-05-07 07:22:46
【问题描述】:

退出我的应用程序时,我需要停止/中断我自己创建的线程。我怎样才能做到这一点? 应该可以点击任何活动的主页按钮,它应该结束线程。

基本上我创建的线程充当会话,当一个注销或他的会话时间到期或应用程序关闭时,我需要停止线程。对于前两种情况,我已经做到了,但在第三种情况下我无法做到。事实上,一旦我在我的 logCat 中退出应用程序,我就可以看到线程,当它自然死亡时,我会收到一个 toast 通知(我显然不想要)。太棒了!

【问题讨论】:

  • 该线程到底在做什么,为什么需要停止?
  • 见鬼,为什么它首先是一个线程?如果我有一个开发人员说他要使用一个“充当会话”的线程,我可能会倾向于立即解雇他。
  • @CommonsWare 因为我使用的 web 服务没有给我一个确定时间的会话 cookie。我还能怎么做?
  • “我还能怎么做”——你可以通过 Web 应用程序来做,这不会涉及分叉线程。例如,您可以使用boolean 来跟踪您是否已登录,或者您可以使用Calendar 对象来表示您认为用户的会话何时将不再有效。
  • 日历示例似乎符合我的要求(因为我对会话时间感兴趣)。你能告诉我和例子/教程吗?将不胜感激!

标签: android multithreading session


【解决方案1】:

首先,由于 Android 的多任务系统,应用程序并没有真正退出。当 home 被击中时,应用程序被暂停,所以 onPaused 方法被调用。当您回击时,或者如果设备决定它需要更多内存,应用程序将被终止并调用 onDestroed(两者之间有一个步骤)。查看android生命周期。Here

如果我是你,你会将线程停止放在 onDestroyed 方法中,因为这是需要再次创建应用程序的地方,但在销毁时都会调用它们。

但是,在您的情况下,您似乎想要一些更像Service 的东西。服务就像一个活动,但在后台运行,没有 UI。就像潘多拉在没有应用程序启动的情况下播放音乐一样。使用服务,您可以从您的任何活动中启动它,并在任何活动被终止时结束它(onStop 或在 Destroy 上),您可以执行类似信号量的解决方案,当使用它的所有活动都被终止时,它会自行终止。当使用它的任何活动启动(onCreate 或 onStart)时,它会启动服务。然后您可以通过静态成员访问该服务或在每个活动中保留它的实例,

【讨论】:

  • 非常有趣。我也可以与服务交互吗?因为我需要检查会话时间并在此基础上关闭会话/保持会话打开。
  • 是的,如果我有任何需要作为公共静态变量访问的东西,那么当我知道数据存在时,我只需点击 TimerSaverService.currentData。您还可以从当前活动中附加一个侦听器,以便在活动中拥有服务调用方法。
【解决方案2】:

如果你想停止单个线程 yourThread.stop() 应该可以工作。否则使用爱斯特拉冈的答案。

【讨论】:

【解决方案3】:

这很邪恶,但你有没有尝试过

Process.killProcess(Process.myPid());

在你上次活动的 onDestroy 中?

否则,正如 estragon 所说,http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle 将是使用活动的正确方式

【讨论】:

  • 事情是,任何活动都可以关闭应用程序
【解决方案4】:

我不确定我是否真的理解你想要的,但你应该检查与活动生命周期相关的方法:

=> http://developer.android.com/reference/android/app/Activity.html

寻找

onPause()
onResume()
onStop()

然后,在每个事件中,你都可以对线程做任何你想做的事情,比如停止它

【讨论】:

  • 纠正自己:p 我会选择 onPause + onStop
【解决方案5】:

您需要在 onStop 方法中为所有活动中断线程。但它不是一种复杂的做事方式。可能还有其他一些解决方案,比如定义一个自定义类来扩展 android 的 Application 类并使用静态方法在该类中设置您想要的逻辑等。

【讨论】:

  • 如果我处理 loginActivity 以外的线程表单活动,我会得到一个空点异常
  • 是的,因为您在其他活动中没有线程。我认为你真的应该去扩展 Application 类解决方案。
  • 我目前正在这样做,但在应用程序类中我没有任何方法可以让我“检查”我的应用程序的状态并因此中断线程。没有适用于应用程序的 onDestroy()、onSomething() 方法。我该怎么做呢?
  • 为什么不在该类中定义自己的静态布尔标志并将该标志设置为在所有活动的 onStart 方法中为 True,在 onStop 中为 False,并让您的线程读取该标志值每个循环来判断是否杀死它自己。事实上,你甚至不需要为此设置一个 Application 类。只需在您的任何课程中使用公共静态字段
  • 嗯不错的主意,除了线程不会使用少量资源仍在后台工作吗?因为只有当您再次打开应用程序时线程才会真正停止?
猜你喜欢
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多