运算符,将Observable <list <object >>转换为Object

时间:2018-10-04 11:24:51

标签: android rx-java2

任何帮助表示赞赏!!!用户第一次进入屏幕时,检查数据是否在本地存储中可用,如果不是,则从网络请求数据,然后转储到本地存储中;如果数据在本地存储中可用,则显示来自本地的数据。本地存储。 我的问题是,在进行网络调用时,我以列表的形式从服务器获得响应,并且我想将数据插入到本地存储中,这是网络结果中期望的对象。我如何才能做到这一点。我的尝试

@Override
    public void getEventDetail(JSONObject jsonObject) {
        Single<List<EventDetailResponse>> getAllEventFromLocalDb = getDataManager().getAllEventDetail();
        Single<List<EventDetailResponse>> getEventFromNetwork = getDataManager().doEventDetailCall(jsonObject);
        Flowable<List<EventDetailResponse>> response = Single.concat(getAllEventFromLocalDb, getEventFromNetwork);
        getCompositeDisposable().add(response
                .filter(list -> !list.isEmpty()).first(new ArrayList<>())
                .subscribeOn(getSchedulerProvider().io())
                .observeOn(getSchedulerProvider().ui())
                .subscribe(list->{
                    Log.e("sizee",""+list.size());
                },throwable -> {handleError(throwable);}));
    }

从网络中获取数据时,我的列表大小非常合适。在可观察的下方,我必须在上方调用并在onsubscribe中获得一次结果。

public Observable<Long> insertEventDetail(EventDetailResponse eventDetailResponse) {
        return Observable.fromCallable(new Callable<Long>() {
            @Override
            public Long call() throws Exception {
                return mDaoSession.getEventDetailResponseDao().insert(eventDetailResponse);
            }
        });
    }

1 个答案:

答案 0 :(得分:0)

您需要使用flatMapIterable来迭代列表中的每个项目。请记住,flatMapIterable不遵守列表中的原始顺序。如果需要保留订单,请使用concatMapIterable

getCompositeDisposable().add(response
            .filter(list -> !list.isEmpty())
            .flatMapIterable(x -> x)
            .subscribeOn(getSchedulerProvider().io())
            .observeOn(getSchedulerProvider().ui())
            .subscribe(item -> {
                insertEventDetail(item);
                Log.e("sizee",""+list.size());
            },throwable -> {handleError(throwable);}));