摘要:按照計劃這一期是要介紹框架結構和設計思想的,但是考慮到將在十月底發(fā)布正式版因此決定將框架結構和設計思想分析放到正式版發(fā)布后再做。后續(xù)我也會有一系列的文章來介紹和的區(qū)別。首選我們需要調用系統(tǒng)來獲取所有已安裝的,所以在的方法中調用。
轉載請注明出處:[https://zhuanlan.zhihu.com/p/...
RxJava系列1(簡介)
RxJava系列2(基本概念及使用介紹)
RxJava系列3(轉換操作符)
RxJava系列4(過濾操作符)
RxJava系列5(組合操作符)
RxJava系列6(從微觀角度解讀RxJava源碼)
RxJava系列7(最佳實踐)
前言有點標題黨了,其實談不上什么最佳實踐。前段時間公司實行996,所以也沒什么時間和精力來更新博客(好吧~我承認是我懶~)。因此這篇文章只是簡單的通過兩個例子介紹了RxJava在生產環(huán)境中的使用。不過本篇中的每個例子我都配上了完整的代碼。
示例一、獲取手機上已安裝的App按照計劃這一期是要介紹RxJava框架結構和設計思想的,但是考慮到Netflix將在十月底發(fā)布RxJava2.0正式版;因此決定將RxJava框架結構和設計思想分析放到2.0正式版發(fā)布后再做。后續(xù)我也會有一系列的文章來介紹RxJava1.x和2.x的區(qū)別。
第一個例子我們需要在Android設備上展示已安裝的第三方app列表,關于環(huán)境搭建、依賴配置、RecyclerView的使用等這些基礎內容我就不做陳述了。需要了解的同學可以去GitHub上把項目clone下來看看。這里我主要講講如何通過RxJava實現(xiàn)核心功能。
首選我們需要調用系統(tǒng)api來獲取所有已安裝的app,所以在OnSubscribe的call方法中調用getApplicationInfoList()。但是getApplicationInfoList()獲取的數(shù)據(jù)并不能完全滿足我們的業(yè)務需求:
由于我們只需要展示手機上已安裝的第三方App,因此需要通過filter操作符來過濾掉系統(tǒng)app;
ApplicationInfo并不是我們所需要的類型,因此需要通過map操作符將其轉換為AppInfo;
由于獲取ApplicationInfo、過濾數(shù)據(jù)、轉換數(shù)據(jù)相對比較耗時,因此需要通過subscribeOn操作符將這一系列操作放到子線程中來處理;
而要將信息展示在頁面上涉及到UI操作,因此需要通過observeOn操作符將onNext、onCompleted、onError調度到主線程,接著我們在這些方法中更新UI。
下面是核心代碼:
final PackageManager pm = MainActivity.this.getPackageManager(); Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber super ApplicationInfo> subscriber) { List infoList = getApplicationInfoList(pm); for (ApplicationInfo info : infoList) { subscriber.onNext(info); } subscriber.onCompleted(); } }).filter(new Func1 () { @Override public Boolean call(ApplicationInfo applicationInfo) { return (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0; } }).map(new Func1 () { @Override public AppInfo call(ApplicationInfo applicationInfo) { AppInfo info = new AppInfo(); info.setAppIcon(applicationInfo.loadIcon(pm)); info.setAppName(applicationInfo.loadLabel(pm).toString()); return info; } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber () { @Override public void onCompleted() { mAppListAdapter.notifyDataSetChanged(); mPullDownSRL.setRefreshing(false); } @Override public void onError(Throwable e) { mPullDownSRL.setRefreshing(false); } @Override public void onNext(AppInfo appInfo) { mAppInfoList.add(appInfo); } });
程序執(zhí)行效果圖:
完整的代碼我放到了GitHub上,有興趣大家可以去clone下來自己運行看看。
源碼地址:https://github.com/BaronZ88/HelloRxAndroid
示例二、RxJava+Retrofit2實現(xiàn)獲取天氣數(shù)據(jù)RxJava + Retrofit2幾乎是Android應用開發(fā)的標配了,這個例子中我們就來聊聊這二者是如何配合起來幫助我們快速開發(fā)的。
Retrofit2中一個標準的接口定義是這樣的:
@GET("weather") ObservablegetWeather(@Query("cityId") String cityId);
現(xiàn)在有了RxJava,一個基本的網絡請求我們便可以這樣實現(xiàn):
ApiClient.weatherService.getWeather(cityId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1() { @Override public void call(Weather weather) { weatherView.displayWeatherInformation(weather); } });
但有時候可能一開始我們并不知道cityId,我們只知道cityName。所以就需要我們先訪問服務器,拿到對應城市名的cityId,然后通過這個cityId再去獲取天氣數(shù)據(jù)。
同樣的,我們需要定義一個獲取cityId的接口:
@GET("city") ObservablegetCityIdByName(@Query("cityName") String cityName);
緊接著我們便可以使用無所不能的RxJava來實現(xiàn)需求了。
ApiClient.weatherService.getCityIdByName("上海") .flatMap(new Func1>() { @Override public Observable call(String cityId) { return ApiClient.weatherService.getWeather(cityId); } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1 () { @Override public void call(Weather weather) { weatherView.displayWeatherInformation(weather); } });
哇哦!~ so easy!!!媽媽再也不用擔心....
源碼地址:https://github.com/BaronZ88/WeatherStyle
WeatherStyle)這個項目還在開發(fā)中,這個項目不只包含了RxJava和Retrofit的使用,同時還包含MVP、ORMLite、RetroLambda、ButterKnife等等開源庫的使用
RxJava1.X的系列文章就到此結束了,由于本人對RxJava的理解有限,這一系列文章中如有錯誤還請大家指正。在使用RxJava過程中有任何疑問也歡迎大家和我交流。共同學習!共同進步!
好啦,我們RxJava2見!~
如果大家喜歡這一系列的文章,歡迎關注我的知乎專欄和GitHub。
知乎專欄:https://zhuanlan.zhihu.com/baron
GitHub:https://github.com/BaronZ88
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66532.html
摘要:之前寫過一系列的文章,也承諾過會盡快有的介紹。所以這次還是給大家分享一個使用解決問題的案例,希望對大家在使用的時候有一點點啟發(fā)。上述這一套復雜的業(yè)務邏輯如果使用傳統(tǒng)編碼方式將是極其復雜的。 之前寫過一系列RxJava1的文章,也承諾過會盡快有RxJava2的介紹。無奈實際項目中還未真正的使用RxJava2,不敢妄動筆墨。所以這次還是給大家分享一個使用RxJava1解決問題的案例,希望對...
摘要:而這個就是線程調度的關鍵前面的例子中我們通過指定了發(fā)射處理事件以及通知觀察者的一系列操作的執(zhí)行線程,正是通過這個創(chuàng)建了我們前面提到的。總結這一章以執(zhí)行流程操作符實現(xiàn)以及線程調度三個方面為切入點剖析了源碼。 轉載請注明出處:https://zhuanlan.zhihu.com/p/22338235 RxJava系列1(簡介) RxJava系列2(基本概念及使用介紹) RxJava系列3...
閱讀 2898·2021-11-15 11:39
閱讀 1884·2021-09-24 09:48
閱讀 1072·2021-09-22 15:36
閱讀 3597·2021-09-10 11:22
閱讀 3061·2021-09-07 09:59
閱讀 960·2021-09-03 10:28
閱讀 680·2021-09-02 15:15
閱讀 2748·2021-08-27 16:24