【问题标题】:How to use androidx.work to replace AsyncTask?如何使用 androidx.work 替换 AsyncTask?
【发布时间】:2019-03-21 03:12:36
【问题描述】:

最近我正在尝试使用androidx.work.* 的东西来执行后台任务。它适用于 MVVM 模式。但是,我在使用 Worker(通过 OneTimeWorkRequest.Builder)替换 AsyncTask 时遇到了几个问题。

首先,如何将通用对象结果从 Worker 传回?似乎只支持原始类型。如果我想在工作线程中解码图像文件并将解码的可绘制或位图传递回主线程观察者怎么办?我有一个解决方法是将对象放在某个全局数据存储中,但这似乎不是一个好习惯。

另一个问题是,当我尝试观察通过WorkManager.getWorkInfosByTagLiveData(TAG_NAME) 获得的实时数据时,它还会将以前排队的工人信息返回给我。所以我必须打电话给WorkManager.pruneWork() 来避免这个问题。而且这似乎也不是一个好习惯。

感谢您的建议。

【问题讨论】:

  • 是的,我已经通过了图像的Uri,让worker去解码。问题是如何优雅地传递解码后的位图或drawable?
  • 我看到了那个 codelab 并从中学到了 Worker 的东西。而且我不喜欢它通过内容提供者传递数据的方式,这对于简单的解码请求来说太重了。可能我想多了,还是坚持用简单的AsyncTask吧。
  • 这并不是 WorkManager 的真正用途。它用于执行长期的后台类型任务。就像您想从新闻源下载几十个故事并将其写入本地缓存以供以后使用一样。它不适用于要立即运行并更新 UI 的任务。
  • 您可以使用 Rxjava 或 Executors 来执行即时后台任务,而不是工作管理器。工作经理旨在执行可以委派的长期后台任务。

标签: android android-asynctask androidx android-workmanager


【解决方案1】:

关于返回结果:简单来说,和你用 AsyncTask 做的一样。您不应该在任务之间传递对象。使用此答案中解释的“回调”或接口:

How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2018-04-03
    • 1970-01-01
    • 2021-08-01
    • 2021-09-09
    • 2013-11-18
    • 2016-01-29
    相关资源
    最近更新 更多