【问题标题】:How to stop asynctask thread in android?如何在android中停止异步任务线程?
【发布时间】:2011-12-10 21:35:56
【问题描述】:

我想从另一个 AsyncTask 线程中停止一个 AsyncTask 线程。我试过像 new AsyncTask.cancel(true) 停止后台进程但它没有停止。

谁能帮我解决这个问题?

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    在您的活动中声明您的 asyncTask:

    private YourAsyncTask mTask;
    

    像这样实例化它:

    mTask = new YourAsyncTask().execute();
    

    像这样杀死/取消它:

    mTask.cancel(true);
    

    【讨论】:

    • 像这样使用 YourAsynchTask mTask=new YourAsncTask(); mTask.execute();工作。不错。
    • 这有点烦人,例如,如果您正在进行单个操作(如数据库查询),您就无法真正取消。如果查询需要很长时间并且只是一个调用,那么似乎没有办法取消它:/
    • 如果您在 AsyncTask 中做某事(在一个循环中),那么您可能需要检查 isCancelled() - 请参阅 stackoverflow.com/questions/10882543/…
    【解决方案2】:

    事情没有停止的原因是进程 (doInBackground()) 一直运行到完成。因此,您应该在执行操作之前检查线程是否被取消:

    if(!isCancelled()){
    // Do your stuff
    }
    

    所以基本上,如果线程没有被取消,就去做,否则跳过它:) 在您的操作过程中检查这些可能很有用,尤其是在花费时间之前。

    另外,“清理”一点也很有用

    onCancelled();
    

    AsyncTask 的文档:

    http://developer.android.com/reference/android/os/AsyncTask.html

    希望这会有所帮助!

    【讨论】:

    • 如果您将 true 作为参数传递,那么它将在后台任务上停止,因此只有将 false 传递给 task.cancel(boolean) 时才会有帮助
    • @DylanVanderBerg 这并不完全正确。如果您没有以严格的线性方式设计代码,那么了解这一点非常很有帮助。虽然您可能不会在doInBackground 中检查isCancelled,但这并不是唯一有效的地方,onCancelled 可能是平稳运行和内存错误之间的区别。
    【解决方案3】:

    您可能还必须在onPauseonDestroyActivity 生命周期中使用它:

    //you may call the cancel() method but if it is not handled in doInBackground() method
    if (loginTask != null && loginTask.getStatus() != AsyncTask.Status.FINISHED)
        loginTask.cancel(true);
    

    loginTaskAsyncTask 的对象

    谢谢。

    【讨论】:

    • 我就是为此而来的!
    【解决方案4】:

    你不能立即杀死 asynctask。为了让它停止,你应该先取消它:

    task.cancel(true);
    

    然后在 asynctask 的 doInBackground() 方法中检查它是否已经被取消:

    isCancelled()
    

    如果是,请停止手动执行。

    【讨论】:

      【解决方案5】:

      我遇到了类似的问题 - 本质上,在用户销毁片段后,我在异步任务中获得了 NPE。在 Stack Overflow 上研究了这个问题后,我采用了以下解决方案:

      volatile boolean running;
      
      public void onActivityCreated (Bundle savedInstanceState) {
      
          super.onActivityCreated(savedInstanceState);
      
          running=true;
          ...
          }
      
      
      public void onDestroy() {
          super.onDestroy();
      
          running=false;
          ...
      }
      

      然后,我会定期在我的异步代码中检查“是否正在运行”。我已经对此进行了压力测试,现在我无法“破坏”我的活动。这完美地工作并且具有比我在 SO 上看到的一些解决方案更简单的优点。

      【讨论】:

        【解决方案6】:

        你可以检查一次 onCancelled() :

        受保护的对象 doInBackground(Object... x) {

        while (/* condition */) {
          if (isCancelled()) break;
        }
        return null;
        

        }

        【讨论】:

          猜你喜欢
          • 2012-08-06
          • 1970-01-01
          • 1970-01-01
          • 2016-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多