4

这是我的过程和问题:

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

  2. 在此菜单中,您按下一个切换按钮,该按钮将启动一个异步任务(每 30 秒发出一次提示音)。这个任务是在toggle被选中时一直运行,在未选中时取消。只要您留在菜单窗口中,这项工作就可以开始和停止该过程。

  3. 检查切换框!

  4. 如果窗口被剥离并再次打开菜单,则我的切换保存状态为 Checked 并且该过程仍在运行。但是我认为我无法访问该异步任务的实例。这可能是为什么取消选中切换会导致程序崩溃?
    myTask.cancle(true); 可能就像一个丢失的参考,我的异步任务现在在我无法再调用或控制它的虚空中流出!

在这种情况下,我能做些什么来获取异步任务并取消它?

TL,博士;如果我从一个活动 (mTask = new ...) 生成一个异步任务,但随后离开该活动,我如何仍能访问 mTask?

4

2 回答 2

0

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

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

有关取消同步任务 Android 的更多信息,请参阅此内容 - 强制取消 AsyncTask

于 2012-11-11T22:02:18.113 回答
0

我认为您不应该使用AsyncTaskAPI,它旨在在后台线程中运行耗时的任务,并提供挂钩以在 UI 完成或有中间结果时更新它。

您可以简单地使用 aRunnable和单例模式来跨活动构造和破坏定位实例。类似的东西(为简洁起见,省略了单例样板)

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。

于 2012-11-11T23:45:28.920 回答