【问题标题】:Logic to update network requests using Work Manager使用工作管理器更新网络请求的逻辑
【发布时间】:2021-02-23 14:40:33
【问题描述】:

我有一个从 API 获取数据的应用程序。所以基本上,现在,该应用程序是这样工作的:

  • 如果连接到互联网,获取数据并使用 Android Room 存储以供离线使用
  • 如果未连接到 Internet,请检查 Room 中是否存在数据。如果存在,显示它。如果不存在,则显示错误消息。

我在网上做了一些关于如何实施有效的离线存储策略的研究,Google 建议使用 Work Manager 对请求进行排队,然后在连接时发送。

我真的想知道如何实现这个? (不是代码而是逻辑,即我应该每天安排对 API 的请求还是每次连接到互联网时?)

如果有离线应用经验的人可以提供帮助,那就太好了。

我的网络请求是通过 Retrofit 完成的,我已经创建了一个执行 API 调用的类。

【问题讨论】:

  • 通过利用所有约束,每天安排一次对数据友好。在我的应用程序中,当用户如果 -> 连接到 WiFi、当前未使用移动设备、电池已插入等时,重复性工作每天发生一次。每次用户连接到互联网时安排请求都会耗尽电池电量,这显然不是一个好习惯。

标签: android kotlin android-workmanager offline-caching


【解决方案1】:

请记住,WM(工作管理器)旨在在满足某些条件时执行操作(例如:用户有足够的电池、显示器关闭等)。因此,这可能最终导致您的数据在您需要时没有更新。 WM 适用于您希望发生但对“立即”发生并不重要的操作。我想说总是使用 Room DB 作为唯一的事实来源。如果数据在房间里,显示它,如果不是,获取它,如果你不能,好吧,你试过了。向用户发送消息。您可以使用NetworkConnectivityListener 来监控连接并检查您是否有待处理的查询(您可以将此查询的参数存储在 Room 数据库中的另一个表中以便于使用)。因此,您将查询数据库,获取待处理的查询(如果有)并执行它们,更新数据,并让 ViewModel/Repository 决定是否有上下文来显示此数据 (UI)。

我觉得你已经非常接近实现你需要的东西了。

换句话说:

UI:观察其 viewModel 的某些 sealed class xxx 状态,告诉它要做什么(显示空列表、显示错误、将数据传递给 recyclerview 适配器等)。

ViewModel:使用其viewModelScope.launch { ... } 将调用repository.fetch(...) 或类似名称。当 Fragment 告诉它(例如用户按下按钮)或在某些生命周期事件(例如 onStart)时,您的 viewModel 将获取此数据。

在这种情况下,存储库通常会公开一个flow(如果您可以使用实验性 api)或一个可以执行以下操作的挂起函数(可能会因您的业务规则而异)

  1. 如果数据库中有数据,请立即返回。
  2. 如果数据是旧的(或者我们仍然想刷新它),然后执行网络 API(如果有连接的话)。如果没有连接,您可以将此“待处理”查询存储在数据库中以备后用。您还可以在执行任何操作之前检查您是否有待处理的查询,它可能已过时,或者您可能需要执行它。
  3. 无论如何,一旦查询通过,您将结果插入数据库,并调用您在步骤 1 中使用的相同方法。
  4. 如果您有一个(或者如果您使用这个),请不要忘记更新您的“待处理”查询。

使用 WorkManager,您可以安排“从 API 获取数据”部分在某个时间发生(这样您的数据将保持更新),但我真的完全取决于您拥有的用例。

【讨论】:

  • @MartinMarconcini 我想我只是在尝试做一些类似于 Mervin 的事情。我试图获取用户输入的数据,缓存它,然后在网络可用时发布到服务器。你能看看我的问题吗? stackoverflow.com/questions/66335097/…
  • @AndroidDev123 过程类似,将数据保存在数据库中(根本不需要连接)。然后,您可以将要上传的数据的参数保存在“待处理查询”(您创建的对象/表)中,然后您可以触发“执行待处理查询”作业(现在或以后通过 WM) .这基本上会检查是否有待处理的作业,执行它们,然后从待处理列表中清除它们。就像一个消息队列。这两种方式都一样。
猜你喜欢
  • 2013-10-10
  • 2020-04-12
  • 2022-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多