活动丢失后终止异步任务

时间:2012-11-11 21:31:38

标签: android android-asynctask

这是我的流程和问题:

  1. 在此应用程序中,单击“菜单”按钮

  2. 在此菜单中按下切换按钮,启动Async-Task(每隔30秒发出一次音调)。此任务是在选中切换时持续运行,并在取消选中时取消。只要您保留在菜单窗口中,此工作就可以启动和停止该过程。

  3. 检查切换框!

  4. 如果窗口被剥离并且Menu再次打开,则切换的保存状态为Checked,并且该过程仍在运行。但是,我认为我失去了对异步任务实例的访问权限。这可能是为什么取消选中切换会使程序崩溃的原因? myTask.cancle(真);可能就像一个丢失的参考,我的Asynch-Task现在正在虚空中流淌出来,我再也无法召唤或控制它了!

  5. 在这种情况下,我该怎么做才能获取异步任务并取消它?

    TL,DR;  如果我从一个活动(mTask = new ...)生成异步任务,但是然后离开该活动,我怎样才能访问mTask?

2 个答案:

答案 0 :(得分:0)

如果活动被销毁/停止,如果不需要,您应该立即停止同步任务,

@Override
public void onStop(){
    mTask.cancel();
}

有关取消同步任务的详细信息,请参阅此处 Android - Cancel AsyncTask Forcefully

答案 1 :(得分:0)

我认为您不应该使用AsyncTask API,该API用于在后台线程中运行耗时的任务,并提供挂钩以在UI完成或具有中间结果时更新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。