在RxJava中保存并从磁盘获取缓存数据

时间:2015-11-10 18:53:36

标签: android rx-java rx-android

我在我的应用程序中使用Rx执行api调用,我期待按以下顺序执行此操作

  1. 检查是否有互联网连接
  2. 如果为真(从1开始),请为结果调用api
  3. 然后将结果保存在磁盘缓存中
  4. if false(从1开始)发送错误通知并从磁盘缓存加载数据。
  5. 因为我有Observable从磁盘缓存中获取存储的数据:

    @Override
    public Observable<StoryCollectionEntity> getStroty(String id) {
                return Observable.create(new Observable.OnSubscribe<StoryCollectionEntity>() {
                    @Override
                    public void call(Subscriber<? super StoryCollectionEntity> subscriber) {
                       //readFileContent
                       //deserializeS fileContent
                       subscriber.onNext(storyCollectionEntity);
                       subscriber.onCompleted();
                       subscriber.onError()
                    } 
                });
            }
    

    还要将以下内容保存在磁盘中:

        @Override
            public void putStory(StoryCollectionEntity storyCollectionEntity) {
               // save in the disk
            }
    

    我成功地能够保存和检索数据但感觉我的代码不够好,因为有时从api重新获取的数据没有保存在磁盘缓存中 我也在调用onErrorResumeNext上的缓存数据,我觉得这是错误的。

    这是我的代码:

        @Override
         public Observable<StoryCollectionEntity> storyEntityList() {
         return this.restApi.storyCollection()
        .doOnNext(saveStoryCollectionToCache)
        .onErrorResumeNext(
           storyCache.getStroty(StoryCollectionEntity.class.getName()));
       }
    

    此处saveStoryCollectionToCache是:

    private final Action1<StoryCollectionEntity> saveStoryCollectionToCache =
      storyCollectionEntity ->
        {
          if (storyCollectionEntity != null) {
                       storyCache.putStory(storyCollectionEntity);
                       } };
    

    请您帮忙了解如何在我的案例中实现最佳实施。我怎样才能在调用restApi之前检查互联网连接?

    非常感谢

1 个答案:

答案 0 :(得分:3)

你不应该将everithing混合到一个可观察者中。 请阅读这篇文章,解释如何拆分这些东西。 http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/