【问题标题】:Fetching A Paginating URL with Retrofit2 and RxJava使用 Retrofit 和 RxJava 获取分页 URL
【发布时间】:2016-12-15 02:44:13
【问题描述】:

我正在尝试发出 API 请求,该请求需要我从服务器获取 model 中的所有数据。获取不是问题,有效载荷是这样分页的 "meta": { "page": 1, "perPage": 20, "previousPage": false, "nextPage": 2, "pageCount": 2, "total": 37 } 根据我的阅读,使用RxJava 时的尾递归会使您的Observables 变冷。一个例子是这个问题StackOverFlow Question 他正在基于 cmets 旋转多个观察者。我也不太了解RxJava。然后我遇到了这个问题RxJava With Interval and Flatmap。他利用了间隔。但是,interval 会告诉每个20Seconds 发出一次请求,我无法为请求设置计时器,因为它可能更慢或更快。最好把它留给请求本身。所以,我的问题是如何实现需要分页的Request,就像第一个Stack Question 一样。任何帮助,将不胜感激。我的代码库有点像第一个问题的 URL。 谢谢。

【问题讨论】:

    标签: rx-java retrofit2 rx-android


    【解决方案1】:

    我不确定,但我猜你希望从 observable 中获取所有模型。

    下面的代码是解释如何做到这一点的伪代码。

    您的Response 类和Model 类可能是这样的:

    public class Response {
        Meta meta;
        List<Model> models;
    }
    
    public class Model {
        ...
    }
    
    public class Meta {
        int page;
        int perPage;
        boolean previousPage;
        int nextPage;
        int pageCount;
        int total;
    }
    

    创建Observable.OnSubscribe 请求并发出所有模型。 像这样:

    public Observable<List<Model>> getAllModels(ApiService apiService) {
        return Observable.create(new Observable.OnSubscribe<Model>() {
    
            @Override
            public void call(Subscriber<? super Model> subscriber) {
                try {
    
                    final int perPage = 20;
    
                    for (int page = 1, pageCount = 1; page <= pageCount; page++) {
                        Call<Response> call = apiService.getModels(page, perPage);
                        Response response = call.execute().body();
                        subscriber.onNext(response.models);
    
                        pageCount = response.meta.pageCount;
                    }
    
                    subscriber.onCompleted();
    
                } catch (IOException e) {
                    subscriber.onError(e);
                }
            }
        });
    }
    

    调用上面的方法。像这样:

    ApiService apiService = retrofit.create(ApiService.class);
    
    getAllModels(apiService)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(...);
    

    我知道这段代码不是尾递归调用。但我希望这会有所帮助。

    【讨论】:

    • 它有帮助。但是,我使用BehaviorSubject 来实现它。代码更短。还是谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2017-09-26
    • 2016-02-19
    • 2023-03-15
    • 2015-04-10
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多