Retrofit获取多个请求的最后一个请求

时间:2017-09-07 11:58:12

标签: android rx-java retrofit2 okhttp3

我有一个包含物品的回收者视图。当我点击一个项目时,我进行api调用以获取一些数据以将其附加到另一个回收站视图中,问题是当用户在回收器中的项目中多次单击它会产生许多api请求并返回最后一个而我只关心最后点击的项目请求,我想取消其余的请求并忽略它们我尝试使用计时器,但它失败

有我当前的代码

 @Override
    public void onSelectedSourceClick(SelectedSource selectedSource, int position) {
        newsAdapter.clearNewsList();

        okHttpClient.dispatcher().cancelAll();

        if (countDownTimer != null) {
            countDownTimer.cancel();
        }
        countDownTimer = new CountDownTimer(500, 1000) {
            @Override
            public void onTick(long l) {

            }

            @Override
            public void onFinish() {
//Make the request here
                }
            }
        }.start();

    }

但是这个解决方案确实不起作用,所以如果有人有解决方案或使用RxJava。

2 个答案:

答案 0 :(得分:1)

我正在寻找类似的东西。这是我使用Retrofit + RxJava

实现这一目标的方法

创建CompositeSubscription

private CompositeSubscription mSearchPlaceSubscription = new CompositeSubscription();

现在你在调用API&订阅新的API调用,我做

mSearchPlaceSubscription.clear();

该步骤将导致取消订阅以前的请求&因此RxJavaCallAdapter会要求okhttp客户端取消请求。

&安培;然后我通过这种方式调用API:

mSearchPlaceSubscription.add(mSearchPlacesHelper.searchPlaces(query)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<List<Prediction>>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(List<Prediction> predictions) {
                        setChanged();
                        notifyObservers(predictions);
                    }
                }));

这里

mSearchPlacesHelper.searchPlaces(query)会返回我Observable(返回subscribe)的Subscription。我在里面做了所有这些代码 mSearchPlaceSubscription.add()接受Subscription对象。

所以我的最终API调用如下:

mSearchPlaceSubscription.clear();
mSearchPlaceSubscription.add(mSearchPlacesHelper.searchPlaces(query)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<List<Prediction>>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(List<Prediction> predictions) {

                    }
                }));

希望这会有所帮助:)

答案 1 :(得分:0)

您可以通过在发出新请求时取消所有待处理请求来执行此操作。 就像你按下两个项目一样,当你发出第二个请求时,使用这段代码取消所有待处理的请求。

client.dispatcher().cancelAll()

希望这会对你有所帮助。