如何取消Retrofit2 Rxjava2

问题描述 投票:0回答:2

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

我使用CompositeDisposable添加每个Disposable并在创建新请求时清除它。

但是,正如我注意到之前的请求未被取消,缓存仍然更新。

   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);
                    }
                });
    }
android retrofit2 rx-java2
2个回答
1
投票

如何在android中取消Retrofit2 Rxjava2?

你必须保持对Disposable对象的引用并在其上调用dispose()


-1
投票

我认为你使用clear()方法而不是dispose()的主要问题。如果打开源代码,您将看到clear()不会更改侦听器的dispose状态。此方法未设置dispos = true。也许正因为如此,搜索请求完成后会触发回调。

您还可以阅读有关debounce()运算符的更多信息。通常它使用即时搜索来防止用户快速打印查询时的不必要请求,并在每次输入更改时开始搜索。 https://www.androidhive.info/RxJava/rxjava-operators-buffer-debounce/

如果你将使用dispose()方法,你也可能必须在处置后重新初始化CompositeDisposable。

CompositeDisposable d = new CompositeDisposable();
d.add(executeSomething());

// Clear requests
d.dispose();
d = new CompositeDisposable();
© www.soinside.com 2019 - 2024. All rights reserved.