編輯:關於Android編程
感覺RxJava最近風生水起,不學習一下都不好意思了,灑家也是初學RxJava,也是感覺代碼好像更復雜更難懂了,看了一篇外文感同身受,簡單翻譯一下。本文簡單介紹使用RxJava優勢所在。但可能需要有一點RxJava基礎,推薦先看一下拋物線的那篇經典的匠心寫作。
—–華麗分割線,譯文開始———
vcq9o6zL5tfFYXBwtcS3otW5o6zO0tDo0qrW2Lm5tPrC66Gi0rux6dK7sem1xNbYuLTR+bDltPrC66Os0tTC+tfj08O7p7K7ts+x5Lj8tcTQwtDox/OjrNXiyMPO0r/gsru/sNHUoaM8YnIgLz4NCgnO0tf2tcS088G/uaTX96OsxuTKtcrHuMTQtM/gudi3vbeous2907/ao6y+zcrH0vLOqtDox/O1xLHkuPyjqNXiyse/qrei0+uy+sa3vOTEx9Cp0aqwuLXE1K3X76Opu/LV39Do0qq4xLHk1bnKvrXE0MXPotLgu/LKx9Do0qq4xLHktKbA7dDFz6LK/b7dLi7V4rrc16W/8aGjwe3N4qOs1eLW1rT6wuvIw8bky/vAtM6su6S1xMjLwLTA7b3io6zNqLOjyse63LrEyrG1xKGjPGJyIC8+DQoJvtm49sD119M6ztLDx9Do0qq008r9vt2/4rvxyKHSu9fp08O7p7XEwbSx7cr9vt2jrLKi1bnKvrP2wLSho87Sw8e/ydLU08NBc3luY1Rhc2u688yosunRr8r9vt2/4qOsu/G1w7XEveG5+7j4VWm1xMrKxeTG99W5yr6z9sC0oaO88rWlyr7A/bT6wuujujwvYmxvY2txdW90ZT4NCjxwcmUgY2xhc3M9"brush:java;">public class SampleTask extends AsyncTask
> { private final SampleAdapter mAdapter; public SampleTask(SampleAdapter sampleAdapter) { mAdapter = sampleAdapater; } @Override protected List doInBackground(Void... voids) { //fetch there results from the database and return them to the onPostExecute List users = getUsersFromDatabase(); return users; } @Override protected void onPostExecute(List users) { super.onPostExecute(products); // Checking if there are users on the database if(users == null) { //No users, presenting a view saying there are no users showEmptyUsersMessageView(); return; } for(User user : users){ mAdapter.add(user); } mAdapter.notifyDataSetChanged(); } } 現在有個新需求,要求只顯示非guest的user,我們處理的方法是,在添加到adapter前加個條件判斷是不是guset,或者改變數據庫查詢的條件。更有甚者,你又被要求從數據庫中獲取另外的其他信息,跟user一並在這個adapter中顯示出來呢?
這就是我們為什麼要用RxJava了,把我們從這個泥潭中拉出來。換個姿勢,我們Rx代碼是這樣子(假設您已學習過Rx基礎用法):public Observable
> fetchUsersFromDatabase() { return Observable.create(new Observable.OnSubscribe (){ @Override public void call(Subscriber> subscriber){ // Fetch information from database subscriber.onNext(getUserList()); subscriber.onCompleted(); } }); }
像這樣被調用:
fetchUsersFromDatabase() .subscribeOn(Schedulers.io()) //will process everything in a new thread .observeOn(AndroidSchedulers.mainThread()) //will listen the results on the main thread .subscribe(new Subscriber
>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(List
users) { //Do whatever you want with each user } }); 開始改需求了哈
怎麼不顯示guests呢,RxJava分分鐘過濾掉這種不速之客:fetchUsersFromDatabase() .filter(new Func1
() { @Override public Boolean call(User user) { //only return the users which are not guests return !user.isGuest(); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber () { @Override public void onCompleted() { } @Override public void onError(Throwable e) { /*Check if there was any error while retrieving from database*/ } @Override public void onNext(User user) { //Do whatever you want with each user } } ); 傳統的方式,即便是個簡單的變更,為了保持優雅的接口化編程,我們也得創建新接口,重構代碼來實現過濾。但是使用RxJava讓這一切變得優雅了,我們只需要一個被觀察者用來獲取所有的信息,讓後你就可以盡情的用這些方法來過濾獲取你想要的數據。
可能你又會說了,ok,這是很好很易讀的結構,但是這似乎使代碼量變多了呢。well you are right,但是這就是Retrolambda閃耀的時候了,這個庫為我們兼容了以使用java8 lambda表達式,方法引用等等。
幫我們簡化代碼如下:fetchUsersFromDatabase() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(value -> { //Do whatever with the value },error -> { //do something with in case of error } );
這個問題完美搞定,然後你又開始問了,我需要增加另外的查詢結果和user一同顯示在這個adapter中怎麼破。這真不是事兒:
fetchUsersFromDatabase() .zipWith(fetchSomethingElseFromDatabase(), (users, somethingElse) -> { /*here combine users and something else into a new object*/ }) .subscribe( o -> { /*use the combine object from users and something else to fill the adapter */ });
如上,我們可以輕松組合數據庫查出來的其他數據和users給一個adapter一同顯示。是不是更易維護,代碼少,易讀,清晰?
小米sim卡怎麼激活?相信很多用戶對於“米SIM”還不是很清楚,更不用說去開通激活了,下文介紹小米sim卡激活圖文教程,一起和小編來
簡介項目開發中發現問題、解決問題這個過程中會出現很多問題,比如重復出現、某個問題的遺留,這些問題的本質就是設計模式。今天記錄設計模式的知識點。內容在java以及其他的面向
PS:最近看到很多人都開始寫年終總結了,時間過得飛快,又到年底了,又老了一歲。學習內容:1.進度條2.縮放3.ControllerBuilder,ControllerLi
在app開發過程中,經常需要顯示media文件的meta data信息,我們如何獲取這些信息呢? MediaStore首先想到的就是MediaStore類了,它