片段

时间:2017-11-02 09:47:05

标签: android rx-java rx-java2

我有一个片段,我在其中执行API请求。这个片段可以作为片段替换的结果返回到后台,然后再返回。 那个时候因为只重新创建了视图,所以我不想重新执行Api调用。 为此我做了,我在存储库multicasted中进行了Api调用,如下所示

        public Flowable<List<Movie>> getMovies() {
                return mRemoteRepository.getMovies()
                        .flatMap(movieResponse -> Flowable.fromCallable(() -> {
                            List<Movie> movies = new ArrayList<>();
                            for (MovieResponse.Result result : movieResponse.results) {
                                Movie movie = new Movie();
                                movie.setName(result.title);
                                movies.add(movie);
                            }
                            return movies;
                        })).replay().refCount();
            }

我的目的是将旧结果重播给新订阅者。因此,在片段视图重新创建之后,如果我再次接到调用 相同的Api请求它会重播旧的响应。 但是在这里我可以看到每当我从后台回来时它都会重新执行。

我认为这是因为当Api呼叫完成时,之前的getMovies()将完成发射。 它是否正确? replay().refcount()仅在正在进行的排放期间以及新用户是否进入时才会执行重播?

然后我尝试replay().autoConnect(),它按预期工作。它不会复制API请求 当碎片从后台堆回来时。所以我能理解的是autoconnect()会保留 即使{A {1}}使用Api调用完成,也可以观察到活动状态。 这是对的吗?但是在我的情况下使用它会导致任何内存泄漏或内存问题吗? 在我的api电话中使用getMovies()是否安全?如何终止autoConnect Observable 当我的片段本身被删除?

1 个答案:

答案 0 :(得分:0)

要使用autoConnect()终止流,请在takeUntil()之前使用autoConnect(),并在需要“丢弃”流时触发事件。

stream().takeUntil(detachEvent())
        .onTerminateDetach()
        .replay().autoConnect()
        .onTerminateDetach()