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

Android 在活动丢失后终止异步任务,android,android-asynctask,Android,Android Asynctask,以下是我的过程和问题: 在此应用程序中,单击菜单按钮 从该菜单中,按下切换按钮,启动异步任务(每30秒发出一次提示音)。此任务在选中切换时持续运行,在取消选中切换时取消。只要您保持在菜单窗口中,就可以启动和停止该过程 选中切换框 如果窗口被向后剥离并且菜单被再次打开,我的切换保存状态将被选中,并且进程仍在运行。然而,我认为我失去了对异步任务实例的访问。这可能就是为什么取消勾选切换会导致程序崩溃的原因? myTask.cancle(true);可能就像一个丢失的引用,而我的异步任务现在正在虚空中流

以下是我的过程和问题:

  • 在此应用程序中,单击菜单按钮

  • 从该菜单中,按下切换按钮,启动异步任务(每30秒发出一次提示音)。此任务在选中切换时持续运行,在取消选中切换时取消。只要您保持在菜单窗口中,就可以启动和停止该过程

  • 选中切换框

  • 如果窗口被向后剥离并且菜单被再次打开,我的切换保存状态将被选中,并且进程仍在运行。然而,我认为我失去了对异步任务实例的访问。这可能就是为什么取消勾选切换会导致程序崩溃的原因?
    myTask.cancle(true);可能就像一个丢失的引用,而我的异步任务现在正在虚空中流出,我无法再调用或控制它了

  • 在这种情况下,我该如何抓取异步任务并取消它

    TL,DR,;
    如果我从一个活动(mTask=new…)生成一个异步任务,然后离开该活动,我如何仍然可以访问mTask?

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

    @Override
    public void onStop(){
        mTask.cancel();
    }
    
    有关取消同步任务的详细信息,请参见此

    我认为您不应该使用
    异步任务
    API,该API用于在后台线程中运行耗时的任务,并提供钩子在UI完成或产生中间结果时更新UI

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

    然后,当您初始化小部件时:

    checkbox.setChecked(Player.isAlive());
    checkbox.setOnCheckedStateChangeListener(new OnCheckedChangeListener(){
      @Override
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked)
          Player.start();
        else
          Player.stop();
      }
    });
    

    这样,您的后台线程就完全独立于启动它的任何活动。

    由于特定的原因,它应该无限期地运行。我知道异步任务并不“意味着”这样做,但是经过评估后,它似乎是最好的解决方案。您应该为这样的任务使用一个服务。除了:1之外,所有这些都可能导致可运行(线程?)结束自身。通过取消选中切换显式终止;2.强制关闭整个应用程序;3.重新启动手机??如果我记得的话,我使用异步任务是因为我需要这个过程在激活后持续运行,即使应用程序没有集中在屏幕上。。。在手机处于开机状态时,跟踪任何可能发生的事件。此线程仅在选中标志时结束。一旦启动,它的生命周期就独立于活动。显然,如果您强制关闭应用程序或重新启动手机,整个过程将终止,线程将关闭。然而,AsyncTask和服务也会发生同样的情况,只是对于服务,您可以声明它们在发生某些事情时自动启动
    checkbox.setChecked(Player.isAlive());
    checkbox.setOnCheckedStateChangeListener(new OnCheckedChangeListener(){
      @Override
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked)
          Player.start();
        else
          Player.stop();
      }
    });