java - 如何在 Android 中强制停止 AsyncTask

标签 java android android-asynctask android-studio

<分区>

在我的应用程序中,我有一个 AsyncTask,我还创建了一个列表,用于将任务添加到该列表。 在 AsyncTask 中,我正在下载一些信息,它工作得很好,但是,当使用 finish() 关闭 Activity 时,我经常会强制关闭,因为 AsyncTask 没有关闭并且当它到达 onPostExecute 并想要与 UI 交互时,它崩溃导致 Activity 被破坏!

这是我试过但没用的方法:

  for (int i = 0; i<tasks.size(); i++){
           tasks.get(i).cancel(true);
       }
  finish();

那么有没有办法强制停止 AsyncTasks 呢?

最佳答案

您对 asyncTask.cancel(true) 感兴趣,实际上在其参数中传递 true,如文档中所示:

mayInterruptIfRunning true if the thread executing this task should be interrupted; otherwise, in-progress tasks are allowed to complete.

然后在你的 AsyncTask.doInBackground 中,你可以像下面这样尝试/捕获 - 但这需要你有抛出 InterruptedException 的阻塞调用,否则你需要不时检查 isCancelled():

@Override
protected Void doInBackground(Void... params) {
  try {
    /// do work, 
  } catch (InterruptedException e) {
    if ( isCancelled() ) {
      // cancel(true) called, dont touch UI!
    }
  }
  return null;
}

此外,在 onPostExecute() 的开头检查 isCancelled() 是安全的.

when it reaches to onPostExecute and wants to interact with UI, it crashes

那是另一个问题,如果你在里面互动 AsyncTask使用 GUI,我首先建议:要使 AsyncTask 成为静态类,将对 Activity 或 Fragment 的引用传递给 AsyncTask 构造函数,然后将其存储为 WeakReference<MyActivity> actRef .然后当你需要它时使用 if ( actRef.get() != null ) {//使用它。 }.通过这种方式,您希望泄漏对您的 Activity/fragment 的引用或使用无效的 UI 对象。

关于java - 如何在 Android 中强制停止 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26216294/

相关文章:

android - 适用于移动设备或特定于移动设备的 Web 应用程序

java - 此代码中的 LDAP 连接泄漏

java - 在 Java 中的另一个类上使用非静态组合框值

java - Spring 启动Redis : Distributed Caching of Objects from Backend Services for parallel consumer requests for the same Object

android - 调试应用程序时在 Android Studio 中设置 GPS 位置

java - Android AsyncTask,处理不可用的服务器

java - 在类数组中分配相同的字段

android - 如何优化从内部存储加载图像到 gridview

Android 如何每秒运行一个 AsyncTask?

android - 使用 REST API 使用 POST 方法在 Android 中登录示例