錯(cuò)誤代碼
Observable
.just(initValues())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(values -> doSomething());
我的需求是調(diào)用initValues()方法從數(shù)據(jù)庫(kù)加載一些數(shù)據(jù)窝趣,在io線程執(zhí)行,然后在mainThread訂閱結(jié)果,但是這樣寫并不能實(shí)現(xiàn)我的需求觅赊。
原因
因?yàn)?strong>just(),from()這類能夠創(chuàng)建Observable的操作符在創(chuàng)建之初琼稻,就已經(jīng)存儲(chǔ)了對(duì)象的值吮螺,而不是在被訂閱的時(shí)候才創(chuàng)建。所以在我們訂閱之前帕翻,initValues()方法就已經(jīng)在開始執(zhí)行了鸠补,這樣就不能達(dá)到我們想要的效果。
解決方法
用create()操作符嘀掸。
Observable
.create(subscriber ->
XXObject values = initValues();
subscriber.onNext(values);
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(values -> doSomething());