18
RxJava@gitbook (yongjhih.gitbooks.io)
IngramChen 積分 0

裡面的例子裡提到 Subject 是拿來做 across thread 的 EventBus。不過範例看起長的都一樣。差別在?

yongjhih 積分 1

沒差,subject 範例,僅是介紹如何改用 subject 。看來先把那冗句搬走 Orz..

koji 積分 2

看到這篇1,但用 otto 慣了好像也沒特別想切過去,雖然說可以寫成下面這樣好像也蠻爽的。

bus.toObserverable().filter(x->x instanceOf xxxEvent).subscribe(...)
yongjhih 積分 0

我也是有看到這篇,雖然我是用 greenbot EventBus,手是有點養...

IngramChen 積分 0

大概瀏覽了一下,整理的很好,這很適合拿來當做內部訓練時的教材。

我們公司的 code base 太舊,所以沒辦法整組換成 RxJava。不過有機會就會想導入。現在正在評估中,對於 thread 怎麼在 android 裡管理比較沒頭緒 (例如,怎麼強制 UI 裡的操作都是 main thread?)

yongjhih 積分 0 編輯於

.observeOn(AndroidScheduler.mainThread()) 應該可以吧?

IngramChen 積分 0 編輯於

是的,不過很多地方都要手寫這行 code 不是?不小心忘了寫就 leak thread (例如 IO) 到 activity 去了。

我有想過用 dynamic proxy 來包,看到回傳的 type 有 Observable,就強制加 .observeOn 。不過不曉得實務上會不會太複雜,或是太沒彈性。

yongjhih 積分 2 編輯於

如果 UI 操作要用了話.. 其實可以看看 RxBinding1 ,目前我們團隊有在用,是有點瘋狂 = =" MVVM + RxJava

yongjhih 積分 1

有個專案就是你說的 dynamic proxy: vbauer/caesar1

IngramChen 積分 0

這個有意思,原來早就有人做好了,謝謝分享

yongjhih 積分 0

搭配 autovalue 應該挺有趣的。不過要改一下 processor。

yongjhih 積分 1 編輯於

我的作法,也是文章內有提及的,在 Android 使用上,都養成習慣使用:AppObservable.bindFragment/.bindActivity ,預設就是幫你設定成 .observeOn(mainThread())

yongjhih 積分 1 編輯於

謝謝。其實我們也是拿來給內部學習用的。很高興能夠幫上忙。

koji 積分 1

關於 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 也停掉不再發事件,不知道有沒建議寫法。

yongjhih 積分 2 編輯於

第一個想法是.. .retry()

koji 積分 0

retry() 會不會把錯誤吞掉? 好像之前有查到這關鍵字,再來研究看看。

yongjhih 積分 2 編輯於

@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
})
caterpillar 積分 2

JCConf 有提到一點 RxJava 入門前的觀念基礎 http://www.codedata.com.tw/social-coding/java8-patterns/

kaif 積分 0

java9有在制定類似的東西嗎?

koji 積分 0

其實 rx 好像變動一直很頻繁,用法,api,短期內不太可能有一整個 rx 的東西進去吧?

caterpillar 積分 0

之前好像有在哪看過會放一些進去 …XD