簡體   English   中英

如何使用反應式android和改造進行多個請求

[英]How to make multiple requests with reactive android and retrofit

我有演示者調用getShops()方法。

Observable<List<Shop>> observable = interactor.getData();
        Subscription subscription = observable
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<List<Shop>>() {
                    @Override
                    public void onCompleted() {
                        view.hideProgress();
                    }

                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);
                        view.hideProgress();
                    }

                    @Override
                    public void onNext(List<Shop> shops) {
                        handleShops(shops);
                        view.onSuccess();
                    }
                });
        composite.add(subscription);

在數據層中,我有一個Interactor,它使用Retrofit向服務器發出請求並返回List<Shop>

@Override
public Observable<List<Shop>> getData() {
    return api.getShops(pageNum).map(new Func1<ShopWrapper, List<Shop>>() {
        @Override
        public List<Shop> call(ShopWrapper wrapper) {
            return wrapper.getShops();
        }
    });
}

問題是我需要使用不同的頁面參數發出多個相同的請求,因為服務器每頁返回N個商店,並且我需要收集所有商店,然后將Observable<List<Shop>>給演示者。

我是Reactive編程的新手,也許有一些操作員可以這樣做。

任何幫助,將不勝感激。

只需使用Observable.rangeconcatMap調用。 如果您不知道上限,可以在某些情況下使用takeUntil

像這樣:

Observable.range(0, Integer.MAX_VALUE)
            .concatMap(pageNum -> api.getShops(pageNum).map(doYourMapping))
            .takeUntil(shops -> someCondition);

如果只需要一個onNext調用,則可以在takeUntil之后添加它:

.flatMapIterable(shops -> shops)
.toList();

您可以使用Observable.concat方法來實現。

/**
 * Returns an Observable that emits the items emitted by two Observables, one after the other, without
 * interleaving them.
*/

Observable<List<Shop>> observable = Observable.concat(
            interactor.getData(0),  interactor.getData(1), interactor.getData(2) //and so on);

您的getData方法應接受pageNum參數:
public Observable<List<Shop>> getData(int pageNum)

但這只是您的特定問題的答案,無法滿足您的需求。 因為正如我所見,頁面計數可能不同,但是concat僅用於可觀察對象的靜態計數。

您可以嘗試使用可觀察的遞歸構建來解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM