簡體   English   中英

如何在不立即訂閱的情況下調用RxJava Observable?

[英]How to call RxJava Observable without immediately subscribing?

我有一個返回字符串模板的java方法。 我想對遠程api進行2次異步調用,每次調用都會返回一個數字,然后我想計算這2個數字的總和,然后將其放入模板中,然后再返回。

所以我有這個Java代碼來實現此任務:

private Observable<Integer> createObservable() {
    Observable<Integer> obs = Observable.create(new OnSubscribe<Integer>() {

        public void call(Subscriber<? super Integer> t) {
            System.out.println("Call with thread : " + Thread.currentThread().getName());
            //FAKE CALL TO REMOTE API => THE THREAD IS SLEEPING DURING 4 SECCONDS
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t.onNext(new Random().nextInt(10));
            t.onCompleted();
        }
    }).subscribeOn(Schedulers.newThread());

    return Observable
        .merge(obs, obs)
        .reduce(new Func2<Integer, Integer, Integer>() {

            public Integer call(Integer t1, Integer t2) {
                return t1 + t2;
            }
        });     
}

public String retrieveTemplate() {
    //I WANT TO START THE WORK OF THE OBSERVABLE HERE BUT I DON'T KNOW HOW TO DO IT

    //DO THINGS IN THE MAIN THREAD
    //HERE I JUST INITIALIZE A STRING BUT WE COULD IMAGINE I WOULD DO MORE THINGS
    String s = "The final Number is {0}";
    System.out.println(Thread.currentThread().getName() + " : the string is initialized");

    //I WAIT FOR THE OBSERVABLE RESULT HERE
    int result = createObservable().toBlocking().first();

    return MessageFormat.format(s, result);
}

此代碼的輸出正確(已創建兩個線程來調用遠程api)

main:字符串被初始化

用線程調用:RxNewThreadScheduler-1

用線程調用:RxNewThreadScheduler-2

最終的數字是2

我想在方法retrieveTemplate的開頭調用RxJava Observable(以便盡快調用遠程api),並在調用MessageFormat.format之前等待結果,但是我不知道該怎么做

假設整個創建過程都可行,您可能希望通過轉換可觀察的源將整個計算綁定到訂閱時刻:

public Observable<String> retrieveTemplate() {
    return createObservable().map(result -> {
        String s = "The final Number is {0}";
        System.out.println(Thread.currentThread().getName() + " : the string is initialized");

        return MessageFormat.format(s, result);
    });
}

當您訂閱retrieveTemplate可觀察結果時,您實際上開始了整個計算:

// some other place in the code
retrieveTemplate().subscribe(template -> doStuffWithTemplate(template))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM