裡面的例子裡提到 Subject 是拿來做 across thread 的 EventBus。不過範例看起長的都一樣。差別在?
沒差,subject 範例,僅是介紹如何改用 subject 。看來先把那冗句搬走 Orz..
大概瀏覽了一下,整理的很好,這很適合拿來當做內部訓練時的教材。
我們公司的 code base 太舊,所以沒辦法整組換成 RxJava。不過有機會就會想導入。現在正在評估中,對於 thread 怎麼在 android 裡管理比較沒頭緒 (例如,怎麼強制 UI 裡的操作都是 main thread?)
用 .observeOn(AndroidScheduler.mainThread())
應該可以吧?
是的,不過很多地方都要手寫這行 code 不是?不小心忘了寫就 leak thread (例如 IO) 到 activity 去了。
我有想過用 dynamic proxy 來包,看到回傳的 type 有 Observable,就強制加 .observeOn
。不過不曉得實務上會不會太複雜,或是太沒彈性。
如果 UI 操作要用了話.. 其實可以看看 RxBinding1 ,目前我們團隊有在用,是有點瘋狂 = =" MVVM + RxJava
有個專案就是你說的 dynamic proxy: vbauer/caesar1
關於 click 觸發 IO 不知道會怎寫 :D? 以下示意省略 bind。
ViewObservable.clicks(findViewById(R.id.like_button))
.subscribe(likes -> {
downloadObs().subcribe(/*update ui*/)
});
或是
ViewObservable.clicks(findViewById(R.id.like_button))
.flatmap( ignore -> downloadObs)
.subscribe(/*update ui*/);
但第二種如果下載有丟出例外的話會讓 click 的 source 也停掉不再發事件,不知道有沒建議寫法。
@koji , 不好意思,我好像漏掉其他要回應的部份。
第一種寫法,在例外發生時,確實不會停掉 subscription ,不過,downloadObs 的部份要稍微修正:1. downloadObs.subscribeOn(Schedulers.io())
下載需背景, 因為這裡 subscriber 已經回到 mainThread() 2. 在 downloadObs 時,Activity/Fragment 生命週期要留意,可包個 AppObservable.bindActivity(activity, downloadObs).subscribe(/*update ui*/
)。
既然都已經交給 ViewObservable 做生命週期管理,所以為了不要再控制 scheduler, 我會選擇第二種寫法只要處理例外就好。
retry() 肯定要把錯誤吞掉才能繼續 retry ,不過如果你想要處理例外後再 retry ,你可以使用 retry(Func2<Integer, Throwable, Boolean> predicate)
:
.retry((i, e) -> { // here i is retry count
e.printStackTrace();
return true; // continue retry if return true
})
JCConf 有提到一點 RxJava 入門前的觀念基礎 http://www.codedata.com.tw/social-coding/java8-patterns/