導航:首頁 > 編程語言 > rxjavafrom和just

rxjavafrom和just

發布時間:2023-11-16 02:11:31

❶ 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線程中運行。

閱讀全文

與rxjavafrom和just相關的資料

熱點內容
源代碼交接清單 瀏覽:825
爐石應用程序異常 瀏覽:37
論文石油數據去哪個網站找 瀏覽:372
創造資料庫的兩種方式是什麼 瀏覽:958
linux使用ss代理伺服器 瀏覽:931
視易魔方機頂盒支持哪些文件 瀏覽:440
壓縮文件付費解壓 瀏覽:352
業務存期代碼 瀏覽:770
把文件下到d盤找不到了 瀏覽:171
蘋果手機有什麼拍攝app軟體推薦 瀏覽:673
網路次爪爪是什麼意思 瀏覽:269
小學教的編程學的什麼 瀏覽:178
cdrX9win10補丁 瀏覽:468
電視安裝提示文件系統未掛載 瀏覽:723
excel讀取文件中的字元串 瀏覽:397
手機文庫下載的文件 瀏覽:700
怎麼查網路的運營商的 瀏覽:127
win101607升級1703 瀏覽:225
人臉識別系統java 瀏覽:391
word公式上標 瀏覽:342

友情鏈接