第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Observable.just(doSomeLongStuff()) 在我訂閱 observable

Observable.just(doSomeLongStuff()) 在我訂閱 observable

尚方寶劍之說(shuō) 2023-03-17 15:15:22
我對(duì) RxJava2 有愚蠢的問(wèn)題。我需要同時(shí)運(yùn)行兩個(gè)長(zhǎng)時(shí)間的操作。我知道我應(yīng)該使用 Observable.zip() 并且我使用了它。問(wèn)題是我的長(zhǎng)期操作一個(gè)接一個(gè)地運(yùn)行,另一個(gè)問(wèn)題是我的長(zhǎng)期操作在我訂閱它們之前就開(kāi)始了。假設(shè)這是我應(yīng)該異步運(yùn)行的長(zhǎng)期操作。private String doSomethingLong() {        Random rand = new Random();        int value = rand.nextInt(5);        Timber.i("Do something for [%d] sec [%s]", value, Thread.currentThread().getName());        try {            Thread.sleep(value * 1000);        } catch (InterruptedException e) {            e.printStackTrace();            return String.format(Locale.getDefault(), "Exception [%s]", e.getMessage());        }        return String.format(Locale.getDefault(),"Job for [%d] seconds", value);    }并讓有一個(gè)像 test() 這樣的方法來(lái)嘗試使其并行:public void test() {        final long started = System.currentTimeMillis();        Observable<String> just1 = Observable.just(doSomethingLong()).subscribeOn(Schedulers.newThread());        Observable<String> just2 = Observable.just(doSomethingLong()).subscribeOn(Schedulers.newThread());        Observable.zip(just1, just2, new Func2<String, String, Combined>() {            @Override            public Combined call(String s, String s2) {                return new Combined(s, s2);            }        }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Combined>() {            @Override            public void onCompleted() {            }            @Override            public void onError(Throwable e) {            }            @Override            public void onNext(Combined combined) {                long total = System.currentTimeMillis() - started;                Timber.i("TOTAL [%d]ms [%s]", total, combined.toString());            }        });    }當(dāng)我嘗試運(yùn)行它時(shí),我觀察到兩個(gè)可觀察對(duì)象 just1 和 just2 一個(gè)接一個(gè)地運(yùn)行……這讓我很困惑……但是還有另一個(gè)工作人員讓我更加困惑......我評(píng)論了 Observable.zip 并注意到 just1 和 just2 在我訂閱它們之前啟動(dòng)了方法 doSomethingLong() ......
查看完整描述

2 回答

?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊

Observable.just訂閱時(shí)不運(yùn)行任何內(nèi)容。它會(huì)在您訂閱時(shí)發(fā)出元素,但您doSomethingLong將在將其作為參數(shù)傳遞后立即運(yùn)行。這很正常,這就是語(yǔ)言的工作方式。


你正在尋找的是一種在我們訂閱時(shí)返回它的方法,但也只在那個(gè)時(shí)候運(yùn)行它,并希望在后臺(tái)線程上運(yùn)行。


有幾個(gè)答案,這里有一些:


使用延遲


有一個(gè)名為的運(yùn)算符defer,它接受一個(gè) lambda,它會(huì)在您訂閱后執(zhí)行:


Observable.defer(() ->  doSomethingLong())

這只會(huì)doSomethingLong在您訂閱時(shí)執(zhí)行


使用 fromCallable


您可以從 lambda 創(chuàng)建一個(gè)可觀察對(duì)象。這被稱為fromCallable:


Observable.fromCallable(() -> doSomethingLong())

同樣,這只會(huì)doSomethingLong在您訂閱時(shí)運(yùn)行


使用創(chuàng)建


我認(rèn)為這可能是最令人氣餒的做法,因?yàn)橛袔准履惚仨毺幚?,但我認(rèn)為對(duì)于完整性來(lái)說(shuō),可以提一下:


Observable.create( emitter -> {

    if(emitter.isDisposed()) return;


    emitter.onNext(doSomethingLong());

    emitter.onComplete();

});

同樣,我確信有更多方法可以做到這一點(diǎn)。我只是想解釋這個(gè)問(wèn)題并提供一些選擇。


查看完整回答
反對(duì) 回復(fù) 2023-03-17
?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊

將您的 Observables 創(chuàng)建為 Observable.fromCallable{}。而不是 zip 使用 combineLatest()

文檔: http ://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html#fromCallable-java.util.concurrent.Callable- http://reactivex.io/documentation/operators/combinelatest.html


查看完整回答
反對(duì) 回復(fù) 2023-03-17
  • 2 回答
  • 0 關(guān)注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)