可观察不重复

时间:2017-12-28 21:13:19

标签: java android observable rx-java2

我正在尝试repeat()一个可观察的动作,但它不会多次执行。

Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> e) throws Exception {
            // **** Code Here is not repeating ****
            e.onNext(pullMessagesFromServer());
        }
    })
    .repeat()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .map(new Function<String, JSONArray>() {
        @Override
        public JSONArray apply(String s) throws Exception {
            return JsonParser.parseString(s);
        }
    })
    .subscribe(new Observer<JSONArray>() {
        @Override
        public void onNext(JSONArray arr) {
            // **** Code Here is not repeating ****
        }  
    });
}

是什么给出的?谢谢! Rxjava的新功能让我感到困惑。 :(

1 个答案:

答案 0 :(得分:0)

从我的评论中:如果源完成,则重复操作。添加e.onComplete()

Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> e) throws Exception {
            // **** Code Here is not repeating ****
            e.onNext(pullMessagesFromServer());
            e.onComplete();
        }
    })
    .repeat()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .map(new Function<String, JSONArray>() {
        @Override
        public JSONArray apply(String s) throws Exception {
            return JsonParser.parseString(s);
        }
    })
    .subscribe(new Observer<JSONArray>() {
        @Override
        public void onNext(JSONArray arr) {
            // **** Code Here is not repeating ****
        }  
    });
}

原因是Observable协议可能是异步的,即事件可能会随着时间的推移而到来。因此,仅仅因为您的代码停止了信号事件,库就无法知道不会有任何进一步的事件。您必须明确指出在使用create()时不会再发出任何值。通常,您可以使用其他工厂方法,例如fromCallable,以确保正确发出单个生成的值:

Observable.fromCallable(new Callable<String>() {
        @Override
        public String call() throws Exception {
            // **** Code Here is not repeating ****
            return pullMessagesFromServer();
        }
    })
    .repeat()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .map(new Function<String, JSONArray>() {
        @Override
        public JSONArray apply(String s) throws Exception {
            return JsonParser.parseString(s);
        }
    })
    .subscribe(new Observer<JSONArray>() {
        @Override
        public void onNext(JSONArray arr) {
            // **** Code Here is not repeating ****
        }  
    });
}