Android 如何取消Rxjava2

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

我创建了一个对youtube api搜索的请求。 发送请求时,必须取消之前的请求,并且不更新缓存

我使用CompositeDisposable添加每个一次性文件,并在创建新请求时将其清除

但是,当我注意到之前的请求没有被取消时,缓存仍然被更新

   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、 我帮不上忙