【问题标题】:RxCache - Prevent observable from getting evictedRxCache - 防止 observable 被驱逐
【发布时间】:2017-08-25 08:36:44
【问题描述】:

我在我的 Android 项目中使用RxCache,当用户没有互联网连接时我遇到了问题。

如果服务器没有返回数据,有没有办法防止 observable 被驱逐?

例如,每次用户刷新新闻提要(拉动刷新)时,getRepository().getFeedPosts(tag, new EvictProvider(true)); 都会被调用。

如果用户突然失去与互联网的连接并再次刷新提要,则服务器不会返回任何数据,observable 将被驱逐并返回缓存版本(因为我在 RxCache 构建器上设置了useExpiredDataIfLoaderNotAvailable(true) )。

再次没有互联网连接,如果用户第二次刷新,没有可用的缓存数据。

有没有办法防止这种情况发生?

谢谢

【问题讨论】:

  • 如果您断开连接并尝试从服务器获取数据或任何其他类型的指示是否存在异常?您可能会过滤无效数据。如果它无效,您将不会回避它。我需要更多代码才能看到发生了什么。
  • 没有例外。据我所知,这是一个 RxCache 限制。

标签: android rx-java rx-android


【解决方案1】:

回答我自己的问题,我猜这是 RxCache 限制。

这是来自 RxCache 的 Victor Albertos 告诉我的:

我认为这是不可能的。准确地说,这是您驱逐某些提供者数据的方式,方法是创建一个抛出的可观察对象。我承认这不是最优的,但如果你想使用更成熟的 API 来正确处理这些场景,我建议你使用ReactiveCache

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题,最后只是添加了一个互联网可用性检查来决定缓存是否应该失效。

    public Boolean isOnline() {
        MyApplication application = MyApplication.sharedApplication();
        ConnectivityManager cm =
                (ConnectivityManager) application.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        return netInfo != null && netInfo.isConnectedOrConnecting();
    }
    

    结合我的缓存 api 调用,如下所示:

    public static  Single<List<People>> getPeopleAttending() {
        PartyManager manager = sharedManager();
        manager.cacheProvider.getPeopleAttending(manager.partyService.getAttending("Party/PeopleAttending"), new EvictProvider(isOnline()));
    }
    

    这样可以确保如果我的应用离线,它会获得缓存的结果。如果在线,它总是会从服务器获取当前参加聚会的人员列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 2020-10-17
      • 2022-11-11
      • 2019-09-13
      相关资源
      最近更新 更多