Android 如何取消Rxjava2
我创建了一个对youtube api搜索的请求。 发送请求时,必须取消之前的请求,并且不更新缓存 我使用CompositeDisposable添加每个一次性文件,并在创建新请求时将其清除 但是,当我注意到之前的请求没有被取消时,缓存仍然被更新Android 如何取消Rxjava2,android,retrofit2,rx-java2,Android,Retrofit2,Rx Java2,我创建了一个对youtube api搜索的请求。 发送请求时,必须取消之前的请求,并且不更新缓存 我使用CompositeDisposable添加每个一次性文件,并在创建新请求时将其清除 但是,当我注意到之前的请求没有被取消时,缓存仍然被更新 disposable.clear(); disposable.add(Network.search(nextPageToken, (isSearchingOnline() ? mFilterText : ""), item.topicId, l
disposable.clear();
disposable.add(Network.search(nextPageToken, (isSearchingOnline() ? mFilterText : ""), item.topicId, listener));
public static Disposable search(String nextPageToken, String query, String topicId, String publishedAfter, OnYoutubeSearchListener listener) {
YParams yParam = new YParams(50, Constants.YOUTUBE_DEVERLOPE_KEY, "snippet", "video", nextPageToken, "10", query, publishedAfter, topicId);
if (cacheData.containsKey(yParam)) {
if (listener != null) {
for (Map.Entry<YParams, List<VideoBean>> entry : cacheData.entrySet()) {
YParams key = entry.getKey();
List<VideoBean> value = entry.getValue();
if (key.equals(yParam)) {
listener.onReturnPageToken(key.getNextPageToken());
listener.onSuccess(value);
break;
}
}
}
return new CompositeDisposable();
}
return Network.getYoutubeApi().search(50, Constants.YOUTUBE_DEVERLOPE_KEY, "snippet", "video", nextPageToken, "10", "", publishedAfter, "")
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap((Function<Videos, ObservableSource<Videos>>) videos -> {
if (videos.items.size() > 0) {
StringBuilder builder = new StringBuilder();
for (Videos.Item i : videos.items) {
builder.append(i.id.videoId);
builder.append(",");
}
yParam.setNextPageToken(videos.nextPageToken);
if (listener != null) {
listener.onReturnPageToken(videos.nextPageToken);
}
return Network.getYoutubeApi().getVideosDetail(Constants.YOUTUBE_DEVERLOPE_KEY, builder.substring(0, builder.length() - 1), "snippet,contentDetails,statistics");
}
return Observable.fromArray(Videos.EMPTY_VIDEOS);
})
.observeOn(AndroidSchedulers.mainThread())
.map(new Function<Videos, List<VideoBean>>() {
@Override
public List<VideoBean> apply(Videos videos) {
List<VideoBean> list = new ArrayList();
for (Videos.Item bean : videos.items) {
list.add(new VideoBean(bean.id.videoId, bean.snippet.title, bean.snippet.description, bean.snippet.thumbnails._default.url, bean.snippet.channelTitle, bean.contentDetails.duration, bean.snippet.publishedAt, 0));
}
return list;
}
})
.subscribe(items -> {
if (items != null && items.size() > 0) {
cacheData.put(yParam, items);
}
if (listener != null) {
listener.onSuccess(items);
}
}, throwable -> {
if (listener != null) {
listener.onFailed(throwable);
}
});
}
disposable.clear();
一次性.add(Network.search(nextPageToken,(isSearchingOnline()?mFilterText:),item.topicId,listener));
公共静态一次性搜索(字符串nextPageToken、字符串查询、字符串topicId、字符串publishedAfter、OnYoutubeSearchListener){
YParams yParam=新的YParams(50,Constants.YOUTUBE_DEVERLOPE_KEY,“snippet”,“video”,nextPageToken,“10”,query,publishedAfter,topicId);
if(cacheData.containsKey(yParam)){
if(侦听器!=null){
对于(Map.Entry:cacheData.entrySet()){
YParams key=entry.getKey();
列表值=entry.getValue();
if(键等于(yParam)){
onReturnPageToken(key.getNextPageToken());
listener.onSuccess(值);
打破
}
}
}
返回新的CompositeDisposable();
}
return Network.getYoutubeApi().search(50,Constants.YOUTUBE_DEVERLOPE_KEY,“snippet”,“video”,nextpGetOken,“10”,publishedfter,”)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap((功能)视频->{
如果(videos.items.size()>0){
StringBuilder=新的StringBuilder();
用于(Videos.Item i:Videos.items){
builder.append(i.id.videoId);
生成器。追加(“,”);
}
yParam.setNextPageToken(videos.nextPageToken);
if(侦听器!=null){
onReturnPageToken(videos.nextPageToken);
}
返回Network.getYoutubeApi().getVideosDetail(Constants.YOUTUBE_DEVERLOPE_KEY,builder.substring(0,builder.length()-1),“snippet,contentDetails,statistics”);
}
返回Observable.fromArray(Videos.EMPTY_Videos);
})
.observeOn(AndroidSchedulers.mainThread())
.map(新函数(){
@凌驾
公开列表应用(视频){
列表=新的ArrayList();
用于(Videos.Item bean:Videos.items){
添加(新的VideoBean(bean.id.videoId,bean.snippet.title,bean.snippet.description,bean.snippet.thumbnails.\u default.url,bean.snippet.channelTitle,bean.contentDetails.duration,bean.snippet.publishedAt,0));
}
退货清单;
}
})
.订阅(项目->{
if(items!=null&&items.size()>0){
cacheData.put(yParam,items);
}
if(侦听器!=null){
listener.onSuccess(项目);
}
},可丢弃->{
if(侦听器!=null){
listener.onFailed(可丢弃);
}
});
}
如何在android中取消Rxjava2
您必须保留对
一次性
对象的引用,并在其上调用dispose()
。请检查我的答案,希望这对您有所帮助。您找到答案了吗?我还想知道如何解决这个问题。d、 我帮不上忙