在活动丢失后终止异步任务

4
这是我的过程和问题:
1. 在此应用程序中,您单击“菜单”按钮。 2. 从此菜单中,您按下一个切换按钮,它启动一个异步任务(每30秒播放一次音调)。 只要切换已选中,此任务就会持续运行,并在取消选中时取消。 只要您仍然在菜单窗口中,这可以正常启动和停止进程。 3. 勾选切换框! 4. 如果窗口被撤回并再次打开菜单,则我的切换保存状态为已选中,并且进程仍在运行。 但是我认为我失去了对该异步任务实例的访问权限。 这可能是取消选中切换后程序崩溃的原因?可能类似于myTask.cancle(true); 失去引用,使得我的异步任务现在流向了不可调用或控制的虚空中! 5. 在这种情况下,我该怎么做才能获取异步任务并将其取消? 简称: 如果我从一个活动中生成异步任务(mTask = new ...),但随后离开该活动,如何仍然访问mTask?
2个回答

0

如果没有必要,当活动被销毁/停止时,应立即停止异步任务。

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

查看此链接以获取有关取消同步任务的更多信息 Android - 强制取消AsyncTask


它应该出于特定原因无限期运行。我知道异步任务不是为此而设计的,但经过评估,它似乎是最佳解决方案。 - iForgotMyLogin
你应该使用一个服务来完成这样的任务。 - Kirill Kulakov

0

我认为你不应该使用 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. 强制关闭整个应用程序;
  3. 重新启动手机; 如果我没记错的话,我正在使用异步任务,因为我需要在激活后不断运行此过程,即使应用程序没有在屏幕上聚焦... 在任何其他可能发生的事情之后运行,只要手机开着就可以。
- iForgotMyLogin
只有在检查标志时,此线程才会结束。一旦启动,它的生命周期就独立于活动之外。显然,如果强制杀死应用程序或重新启动手机,则整个进程将终止并关闭该线程。但是,AsyncTask和Services也是如此,只不过通过Services,您可以声明它们在发生某些情况时自动启动。 - Raffaele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接