Android - 来自多个来源的数据

时间:2017-05-31 19:28:56

标签: android rx-java retrofit2 rx-java2

我正在使用retrofit,rxjava和realm来构建应用程序。这就是我想要实现的目标:

  1. 从本地数据库加载数据,同时发出网络请求
  2. 首次只显示一个装载机
  3. 如果数据已存在于数据库中,则显示它并在某处显示小型装载程序
  4. 当网络结果准备就绪时,更新列表并将结果保存到磁盘
  5. 如果网络结果失败,则显示一条消息,说明数据可能已过时。
  6. 我知道如何使用领域,正确改造,但它的rxjava部分令人困惑。使用rxjava有一种简单的方法吗?

    这是当前代码库的样子:

    CategoryRepository.java

    public Observable<List<Category>> getCategories() {
        return getCategoriesFromNetwork()
                .observeOn(Schedulers.computation())
                .doOnNext(this::saveCategoriesToDisk)
                .publish(nwResponse -> Observable.merge(nwResponse, getCategoriesFromDisk().takeUntil(nwResponse)));
    
    }
    
    
    
    private Observable<List<Category>> getCategoriesFromNetwork() {
            return service.getCategories()
                    .map(categoryListResponse -> categoryListResponse.getData());
    }
    
    
    private Observable<List<Category>> getCategoriesFromDisk() {
            return Observable.just(realm.copyFromRealm(
                        realm.where(Category.class).findAll()
                    ));
    }
    

    视图模型

    categoryRepository.getCategories()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(categories -> {
                        //Do UI stuff
                    }, throwable -> {
    });
    

1 个答案:

答案 0 :(得分:0)

要同时调用这两个函数,您可以使用$("#ruleSearch").keyup(function() { var data = this.value.toLowerCase(); $('.ruleDetailsPlaceholder').unhighlight(); if (data !== "") $('.ruleDetailsPlaceholder').highlight(data); }) 运算符或Zip运算符。它们本质上是相同的,我认为区别在于zip继续你需要两个新的observable并且对于最新组合你只需要一个新的observable来继续lambda。

做一些事情列出这个:

combineLatest