我有一个包含物品的回收者视图。当我点击一个项目时,我进行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。
答案 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()
希望这会对你有所帮助。