導航:首頁 > 編程語言 > 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相關的資料

熱點內容
win10文件夾的圖片自動排列 瀏覽:155
安卓電腦文件管理器 瀏覽:512
聯想手機k860刷機教程 瀏覽:356
oa刪除已發文件 瀏覽:397
win7asp配置文件 瀏覽:362
java網頁能做心跳機制 瀏覽:817
逆戰文件應用在哪裡 瀏覽:102
紅頭文件訂書紅線在哪裡 瀏覽:851
excel怎麼做文件頭 瀏覽:703
為什麼word找不到文件菜單 瀏覽:671
ios15安裝後找不到描述文件 瀏覽:440
學編程怎麼學最有效 瀏覽:873
通過wifi傳文件到ipad 瀏覽:197
js隨機顏色 瀏覽:611
文件快速復制到u盤的軟體 瀏覽:443
如何檢查無線網路驅動是否正常 瀏覽:468
百度網盤來自分享的文件在哪裡 瀏覽:127
如何發視頻到騰訊視頻文件夾里 瀏覽:510
微信打開cad外部文件找不到 瀏覽:882
平板可以打開各種文件後綴的軟體 瀏覽:531

友情鏈接