RxJava:可观察的发出重复值

时间:2017-01-10 12:45:41

标签: rx-java

我正在使用带有3个元素的arraylist的观察者"一个","两个"和"三"。我们以两种相似但略有不同的方式测试它们。您可以将它们视为以下代码中的第1部分和第2部分。

每个测试的结果应该通过sys out返回3行。如果我只保留一个部分并注释掉其他部分,它会有效地完成。

但是我无法理解,如果两个部分保留在那里,第2部分,而不是返回3个值将返回6个值。

不知何故,它受前一次运行(第1部分)的影响,但不确定如何。我试图取消订阅第一个可观察的,但它没有解决问题。

请检查,如果您能找到我在此代码中缺少的确切内容。

        import rx.Observable;
        import rx.Subscription;
        import rx.functions.Func1;

        import java.util.ArrayList;
        import java.util.List;


        public class RxJavaTest {

               static List<String> list = new ArrayList()  ;

            static Observable<List<String>> query(String text)
            {
                list.add("one") ;list.add("two") ;list.add("three") ;

                Observable<List<String>> results = Observable.just(list) ;

                return  results ;
            }

            public static void main(String[] args) {

                Subscription subscription ;

                subscription = query("Hello, World 1").subscribe(urls -> {
                    Observable.from(urls).subscribe(url -> System.out.println("section 1 "+url)) ;
                }) ;

                subscription.unsubscribe();

                query("Hello, World 2")
                        .subscribe(urls -> {
                            for (String url : urls) {
                                System.out.println(" section 2  "+url);
                            }
                        } ) ;


            }

        }

系统输出日志:标记哪些记录是意外的,如果删除第1部分的代码,它将不在那里

section 1 one
section 1 two
section 1 three

 section 2  one
 section 2  two
 section 2  three
 section 2  one --duplicate
 section 2  two --duplicate
 section 2  three --duplicate

1 个答案:

答案 0 :(得分:1)

你有静态列表。您要添加两次(每次调用一次),因此在第二次运行期间,您有两倍的元素。

而不是

        static List<String> list = new ArrayList()  ;

        static Observable<List<String>> query(String text)
        {
            list.add("one") ;list.add("two") ;list.add("three") ;

            Observable<List<String>> results = Observable.just(list) ;

            return  results ;
        }

做类似

的事情
        static Observable<List<String>> query(String text)
        {
            List<String> list = new ArrayList()  ;
            list.add("one") ;list.add("two") ;list.add("three") ;
            Observable<List<String>> results = Observable.just(list) ;
            return  results ;
        }