改造获取多个请求的最后一个请求

Posted

技术标签:

【中文标题】改造获取多个请求的最后一个请求【英文标题】:Retrofit get the last request of multiple requests 【发布时间】:2018-02-16 03:45:48 【问题描述】:

我有一个包含项目的回收站视图。当我单击一个项目时,我进行 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 来解决它。

【问题讨论】:

使用 Retrofit 2 的 Call 类来形成你的网络请求,它也允许取消它。使用数据结构(如 Stack)来保存添加的调用对象的列表,并在每次单击列表项并且必须创建新请求时检查它。如何取消请求 - futurestud.io/tutorials/retrofit-2-cancel-requests 可能也有 Rx 方式,但目前还不知道 【参考方案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() 内完成所有这些代码。

所以我的最终 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) 

                    
                ));

希望这会有所帮助:)

【讨论】:

我使用实时数据工厂返回实时数据对象而不是调用,因此我无法从中返回 obseravble 对不起,我没有得到实时数据对象。你的意思是来自架构组件的 LiveData? 是的,我使用自定义工厂来获取 LiveData 对象而不是调用对象 我还没有使用过 LiveData,但您可以尝试类似的方法。全局存储您在 observe() 中传递的 LiveData 对象和 Observer,在再次调用 liveData.observe(myObserver) 之前,您应该执行 liveData.removeObserver(myObserver)。 & 然后重新初始化 myObserver = new Observer() & 然后将其传递给 liveData.observe(myObserver), 观察者是它自己的活动 LifeCycleOwner【参考方案2】:

您可以通过在发出新请求时取消所有待处理的请求来做到这一点。 就像如果你按下了两个项目,那么当你发出第二个请求时,使用这段代码取消所有待处理的请求。

client.dispatcher().cancelAll()

希望对你有所帮助。

【讨论】:

以上是关于改造获取多个请求的最后一个请求的主要内容,如果未能解决你的问题,请参考以下文章

oAuth 1.0 获取请求改造 android

改造无法将新令牌设置为请求标头

如何使用 rx 从改造中获取请求 url? - 安卓

我如何处理改造错误或获取 URL 请求以检测问题

我如何从多个相同的获取请求中连接/合并多个 json?

改造中的请求网址,即从代码中访问服务器[重复]