【问题标题】:Terminating an Async Task after activity is lost活动丢失后终止异步任务
【发布时间】:2012-10-31 09:38:40
【问题描述】:

这是我的过程和问题:

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

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

  3. 选中切换框!

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

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

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

【问题讨论】:

    标签: android android-asynctask


    【解决方案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,您可以声明它们在发生某些事情时自动启动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多