是否存在使用 AsyncTask 优于 AsyncTaskLoader 的场景?

Is there any scenario where using AsyncTask is better than AsyncTaskLoader?

我目前正在研究加载程序以及它们如何克服应用程序生命周期中的屏幕方向等变化,到目前为止,据我所知,AsyncTaskLoader 与 AsyncTask 的工作相同,甚至更好。因此,AsyncTask 是不是应该被认为过时了,或者它是否为开发人员提供了一些隐藏的优势?

这样想,

AsyncTaskLoader可以在任何有AsyncTask的地方使用。 主要优点是能够在生命周期之间持续存在。

如果您使用 AsyncTask 并调用网络操作从 Internet 获取一些数据并且用户旋转 phone,您的 AsyncTask 将不得不再次启动任务以获取数据,这可能对您的应用程序有潜在危险,因为您可能会发生内存泄漏。

所以,无论如何,Loader 都是 AsyncTask 的进化,它们基本上是 AsyncTasks 的改进。

我相信 AsyncTask 仍然存在,因为当您在后台线程中执行一些简单任务时,您可以使用具有匿名内部 class 的 AsyncTask 更简单地完成此操作,并立即提供结果到 UI 主题。

I am currently studying about Loaders and about how they could overcome changes such as screen orientation during application lifecycle

架构组件对视图模型的支持和 LiveData 是 Google 解决加载程序试图解决的问题的当前方向。

AsyncTaskLoader does the same job as AsyncTask and even better

请注意 AsyncTaskLoader 使用 AsyncTask

should not AsyncTask be considered obsolete

是的,只要我们有其他模式和库可供使用(例如,RxJava,LiveData)。也就是说,正确使用 AsyncTask 是一个不错的选择。挑战在于正确使用它(例如,从保留的片段中,小心避免与后台线程上的托管 activity 交互)。

does it provide the developers with some hidden advantages?

您的论据似乎是"an ocean liner has more features than does a rowboat, so shouldn't we consider rowboats to be obsolete?"。远洋班轮有其成本,远洋班轮不能做划艇可以做的所有事情(例如,在浅水中航行,被拖在卡车后面)。

加载器被设计为——在某种程度上它们曾经有一个"design"——为了:

  • 在后台加载数据,通常通过 AsyncTask
  • 在配置更改时保留该数据
  • 当请求的数据发生变化时自动传送更新

并不是所有的东西都需要它。例如,加载器模式针对读取操作(我们实际上 "load" 数据),但它并不能真正帮助写入操作(我们正在更改数据)。然而,即使我们进行了配置更改,我们仍然希望异步执行写操作并找出结果。您可以将写操作压缩到加载器中,但这并不是天作之合。使用 AsyncTask 或其他东西而不是加载程序会更自然。