AsyncTask 现在是否已通过 AsyncTaskLoader 弃用?

Is AsyncTask deprecated now w/ AsyncTaskLoader?

因为 AsyncTaskLoader 做了 AsyncTask 能做的一切,而且还具有内置的最佳实践功能,例如线程复制和过早死亡预防。

有什么理由再使用 AsyncTask 了吗?或者我应该到处盲目使用 AsyncTaskLoader

AsyncTaskLoader 仅对在 Activity 或 Fragment 中加载数据有用。 AsyncTask 更通用,可以在任何类型的组件中进行任何类型的后台操作。有 RxJava、HandlerThreads、简单线程等替代方案,但肯定不会弃用。

  • 当你有一个后台作业需要完成时,无论 activity 是否被破坏:ServiceIntentService 某种后台作业机制。
  • 当您有需要完成的后台作业并再次通知 UI 时:使用 AsyncTaskLoader
  • 当您有需要完成的后台作业并再次通知用户并继续 运行 时,尽管 activity 已被销毁:使用 AsyncTask 因为 AsyncTask 继续 运行 当你的 activity 被 paused/destroyed/configuration 更改时......在这种情况下,请注意你的内存 leak/activity 对象为空。您必须自己处理。

每一种情况,都有不同的处理和规避方式。但请记住上面的流程以获得最简单的解决方案。

在 2017 年提出这个问题时,AsyncTask 仍然没有被弃用。 但是,它在 Android 11 中被弃用,因为 AsyncTask 需要大量检查以避免内存泄漏。

AndroidASOP项目中的commit@deprecated通知:

@deprecated Use the standard java.util.concurrent or Kotlin concurrency utilities instead.