❶ rxjava能代替handler嗎
RxJava好在哪換句話說,『同樣是做非同步,為什麼人們用它,而不用現成的AsyncTask/Handler/XXX/?』一個詞:簡潔。非同步操作很關鍵的一點是程序的簡潔性,因為在調度過程比較復雜的情況下,非同步代碼經常會既難寫也難被讀懂。Android創造的AsyncTask和Handler,其實都是為了讓非同步代碼更加簡潔。RxJava的優勢也是簡潔,但它的簡潔的與眾不同之處在於,隨著程序邏輯變得越來越復雜,它依然能夠保持簡潔。假設有這樣一個需求:界面上有一個自定義的視圖imageCollectorView,它的作用是顯示多張圖片,並能使用addImage(Bitmap)方法來任意增加顯示的圖片。現在需要程序將一個給出的目錄數組File[]folders中每個目錄下的png圖片都載入出來並顯示在imageCollectorView中。需要注意的是,由於讀取圖片的這一過程較為耗時,需要放在後台執行,而圖片的顯示則必須在UI線程執行。常用的實現方式有多種,我這里貼出其中一種:newThread(){@Overridepublicvoidrun(){super.run();for(Filefolder:folders){File[]files=folder.listFiles();for(Filefile:files){if(file.getName().endsWith(".png")){finalBitmapbitmap=getBitmapFromFile(file);getActivity().runOnUiThread(newRunnable(){@Overridepublicvoidrun(){imageCollectorView.addImage(bitmap);}});}}}}}.start();而如果使用RxJava,實現方式是這樣的:Observable.from(folders).flatMap(newFunc1>(){@OverridepublicObservablecall(Filefile){returnObservable.from(file.listFiles());}}).filter(newFunc1(){@OverridepublicBooleancall(Filefile){returnfile.getName().endsWith(".png");}}).map(newFunc1(){@OverridepublicBitmapcall(Filefile){returngetBitmapFromFile(file);}}).subscribeOn(Schelers.io()).observeOn(AndroidSchelers.mainThread()).subscribe(newAction1(){@Overridepublicvoidcall(Bitmapbitmap){imageCollectorView.addImage(bitmap);}});那位說話了:『你這代碼明明變多了啊!簡潔個毛啊!』大兄弟你消消氣,我說的是邏輯的簡潔,不是單純的代碼量少(邏輯簡潔才是提升讀寫代碼速度的必殺技對不?)。觀察一下你會發現,RxJava的這個實現,是一條從上到下的鏈式調用,沒有任何嵌套,這在邏輯的簡潔性上是具有優勢的。當需求變得復雜時,這種優勢將更加明顯(試想如果還要求只選取前10張圖片,常規方式要怎麼?如果有這樣那樣的要求呢?再試想,在這一大堆需求實現完兩個月之後需要改功能,當你翻回這里看到自己當初寫下的那一片迷之縮進,你能保證自己將迅速看懂,而不是對著代碼重新捋一遍思路?)。另外,如果你的IDE是AndroidStudio,其實每次打開某個Java文件的時候,你會看到被自動Lambda化的預覽,這將讓你更加清晰地看到程序邏輯:Observable.from(folders).flatMap((Func1)(folder)->{Observable.from(file.listFiles())}).filter((Func1)(file)->{file.getName().endsWith(".png")}).map((Func1)(file)->{getBitmapFromFile(file)}).subscribeOn(Schelers.io()).observeOn(AndroidSchelers.mainThread()).subscribe((Action1)(bitmap)->{imageCollectorView.addImage(bitmap)});如果你習慣使用Retrolambda,你也可以直接把代碼寫成上面這種簡潔的形式。而如果你看到這里還不知道什麼是Retrolambda,我不建議你現在就去學習它。原因有兩點:1.Lambda是把雙刃劍,它讓你的代碼簡潔的同時,降低了代碼的可讀性,因此同時學習RxJava和Retrolambda可能會讓你忽略RxJava的一些技術細節;2.Retrolambda是Java6/7對Lambda表達式的非官方兼容方案,它的向後兼容性和穩定性是無法保障的,因此對於企業項目,使用Retrolambda是有風險的。所以,與很多RxJava的推廣者不同,我並不推薦在學習RxJava的同時一起學習Retrolambda。事實上,我個人雖然很欣賞Retrolambda,但我從來不用它。
❷ rxjava zip和merge的區別
跟自merge的區別是:
1.方法的參數不一樣,zip有一個合並函數,merge沒有,所以zip發射數據是合並函數的返回值,merge則是交錯排列多個源Observable發射的數據。
2.merge的終止不會受任何一個Observable的發射完成而終止,zip則只要有一個Observable的發射完成而終止發射
(merge和zip中只要有一個錯誤通知終止,就都終止)
❸ rxjava from和just的區別
EventBus比較適合僅僅當做組件間的通訊工具使用,主要用來傳遞消息。使用EventBus可以避內免搞出一大推的容interface,僅僅是為了實現組件間的通訊,而不得不去實現那一推的介面。
RxJava和EventBus一樣也是基於觀察者模式,但是使用的場景確實非同步數據流的處理。比如下面的例子
Observable.from()
.map((x) -> x + 1)
.filter((x) -> x % 2 == 0)
.subscribe()
通過引入函數式的方式來處理數據流,看起來舒服多了。另外RxJava有大量豐富強大的operator,可以滿足你的大部分數據處理需求。RxJava另一個強大的地方就是他的scheler,你可以為Observable和Subscriber指定不同的執行線程,在Android中,你就可以方便的將Observable指定在IO線程中運行,Subscriber在UI線程中運行。