现在有了AsyncTaskLoader,AsyncTask是否已经被弃用了?

5
据我所知,AsyncTaskLoader不仅具有AsyncTask的所有功能,还内置了避免重复线程和过早终止等最佳实践。
现在还有使用AsyncTask的正当理由吗?还是我应该盲目地始终使用AsyncTaskLoader呢?我提出这个问题是为了确定是否存在任何需要谨慎对待的特殊情况。

1
https://dev59.com/pWw05IYBdhLWcg3wpDRu - Daniel Nugent
1
并且还具有内置的最佳实践功能,例如线程复制和预早死亡防止。AsyncTaskLoader至少在我使用这些术语的意义上没有这些功能。 “还有使用AsyncTask的任何理由吗?”-并非所有内容都适合Loader模式。 “或者我应该无条件地在任何地方使用AsyncTaskLoader”-您不应该“盲目”执行与线程相关的任何操作。不同的情况需要不同的线程使用模式和不同的类(例如,IntentService,自定义ThreadPoolExecutor)。 - CommonsWare
3个回答

6
在2017年提出这个问题时,AsyncTask仍未被弃用。但是,在Android 11中,由于AsyncTask需要进行大量检查以避免内存泄漏,它已经被弃用了。
Android ASOP项目中的提交(commit)已经标注为@deprecated

@deprecated请改用标准的java.util.concurrentKotlin并发工具


6
  • 当您有一个后台作业需要完成,无论活动是否被销毁:Service 或者 IntentService 是一些后台作业的机制。
  • 当您有一个后台作业需要完成并且需要通知 UI:使用 AsyncTaskLoader
  • 当您有一个后台作业需要完成并且需要通知用户并且即使活动被销毁也要继续运行:使用 AsyncTask,因为 AsyncTask 在您的活动被暂停/销毁/配置更改时会继续运行...在这种情况下,请注意您将会有内存泄漏/活动对象为空。您必须自己处理。

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


1
感谢您尽管时间间隔很长仍然回答了我的问题。这增加了我的理解。 - AlanSTACK

4

AsyncTaskLoader 只适用于在 Activity 或 Fragment 中加载数据。AsyncTask 更加灵活,可以在任何组件中执行任何类型的后台操作。还有一些替代方案,如 RxJava、HandlerThreads、简单线程等,但它们肯定不会被弃用。


感谢您的回复。这是否意味着,如果我正在尝试下载一些图像/缩略图并加载一些新内容(评论/喜欢/等等),那么AsyncTaskLoader > AsyncTask?您能否举一个AsyncTask更加灵活的例子? - AlanSTACK
为了加载新内容,通常会使用AsyncTaskLoader。为了加载图像,最好使用专门的图像加载库,如Glide或Picasso。AsyncTask可能是提交数据一次(例如发布表单)的好选择,但要注意生命周期/内存泄漏问题。您还可以使用AsyncTask启动一次性异步操作,即使用户离开活动,该操作也可能继续进行,例如将数据写入磁盘或发送统计信息。或者,如果需要比IntentService更多的控制,则可以从服务中启动AsyncTask。 - BladeCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接