活动丢失后终止异步任务

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,您可以声明它们在发生某些事情时自动启动

以上是关于活动丢失后终止异步任务的主要内容,如果未能解决你的问题,请参考以下文章

导航抽屉异步任务

如何按预定义的秒数终止异步任务请求[重复]

如何将异步任务结果传递给另一个活动?

Android异步任务不会改变用户界面

如何关闭带有异步任务的进度对话框并避免“您的活动是不是运行错误?”

自动挂钩到 Activity 生命周期方法的异步任务库