1

我有一个非常简单的 RXJava 发射器。它实际上是一个 publishSubject,但它的工作是将整数转换为字符串,然后在订阅时更新 UI 元素。代码如下所示:

PublishSubject integerToStringEmitter = PublishSubject.create();

    Subscription mysingle= Single.just(4).map(new Func1<Integer, String>() {


        @Override
        public String call(Integer integer) {
            return String.valueOf(integer);
        }
    }).subscribe(new Observer<String>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(String s) {
            tv.setText(s);
        }
    });
// integerToStringEmitter.subscribe(); //it still emits even without this, why ?

我想要发生的事情:订阅只有在我调用integerToStringEmitter.subscribe(); 时才开始;

当前发生了什么:一旦我启动程序,就会调用 onNext 并且 UI 元素被设置为#4。为什么?我需要对这件事有更多的控制权,所以如果我没有订阅它,它就不会立即执行。请帮忙解决。

4

1 回答 1

2

我不确定你想要达到什么目的。您的代码看起来不正确,甚至不应该编译。如果它可以编译,那么 subscribe(new Observer() {... 部分显然会触发事件流。

这是一个 Observable 发出整数并将它们映射到字符串和订阅它的 Observer 的简单示例:

Observable<String> myObservable = Observable.just(1, 2, 3, 4).map(new Func1<Integer, String>() {
    @Override
    public String call(Integer integer) {
        return String.valueOf(integer);
    }
});

Subscriber<String> mySubscriber = new Subscriber<String>() {
    @Override
    public void onCompleted() {
        System.out.println("onCompleted");
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("onError: " + e.getMessage());
    }

    @Override
    public void onNext(String s) {
        System.out.println("onNext: " +s);
    }
};

myObservable.subscribe(mySubscriber);
于 2016-03-19T21:19:48.443 回答