活动丢失后终止异步任务
Posted
技术标签:
【中文标题】活动丢失后终止异步任务【英文标题】:Terminating an Async Task after activity is lost 【发布时间】:2012-10-31 09:38:40 【问题描述】:这是我的过程和问题:
在此应用程序中单击菜单按钮
在此菜单中,您按下一个切换按钮,该按钮将启动一个异步任务(每 30 秒发出一次提示音)。这个任务是在toggle被选中时一直运行,在未选中时取消。只要您留在菜单窗口中,这项工作就可以启动和停止该过程。
选中切换框!
如果窗口被剥离并再次打开菜单,我的切换保存状态为 Checked 并且进程仍在运行。但是我认为我无法访问该异步任务的实例。这可能是为什么取消选中切换会导致程序崩溃? myTask.cancle(true);可能就像一个丢失的参考,我的异步任务现在在我无法调用或控制的虚空中流出!
在这种情况下,我该怎么做才能获取异步任务并取消它?
TL,DR; 如果我从一个 Activity (mTask = new ...) 生成一个异步任务,然后离开该 Activity,我怎样才能访问 mTask?
【问题讨论】:
【参考方案1】:如果不需要,您应该在活动销毁/停止后立即停止同步任务,
@Override
public void onStop()
mTask.cancel();
有关取消同步任务的详细信息,请参阅此内容 android - Cancel AsyncTask Forcefully
【讨论】:
它应该出于特定原因无限期运行。我知道异步任务不是“意味着”这个,但是经过评估,它似乎是最好的解决方案。 你应该为这样的任务使用服务【参考方案2】:我认为您不应该使用AsyncTask
API,它旨在在后台线程中运行耗时的任务,并提供挂钩以在完成或有中间结果时更新 UI。
您可以简单地使用Runnable
和单例模式来跨活动构造和破坏定位实例。类似的东西(为简洁起见,省略了单个样板)
public class Player implements Runnable
public static void start()
@Override
public void run()
while (alive)
playSound();
sleep();
public static void stop()
public static boolean isAlive()
然后,当您初始化小部件时:
checkbox.setChecked(Player.isAlive());
checkbox.setOnCheckedStateChangeListener(new OnCheckedChangeListener()
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
if (isChecked)
Player.start();
else
Player.stop();
);
这样你的后台线程就完全独立于任何启动它的Activity。
【讨论】:
除了以下之外,还有什么可能导致可运行(线程?)自行结束: 1. 通过取消选中切换显式终止; 2.强制关闭整个app; 3、重启手机; ??如果我记得,我使用的是异步任务,因为我需要这个过程在激活后不断运行,即使应用程序没有专注于屏幕......只要手机打开,就可以在任何其他可能发生的事情后面运行。 此线程仅在检查标志时结束。一旦启动,它的生命周期就独立于 Activity。显然,如果你强行杀死应用程序或重启手机,整个进程就会死掉,线程也会被关闭。然而,AsyncTask 和 Services 也会发生同样的情况,除了使用 Services,您可以声明它们在发生某些事情时自动启动以上是关于活动丢失后终止异步任务的主要内容,如果未能解决你的问题,请参考以下文章