我對Rxjava的理解

1遇到問題:

我們在過長的時間里,習(xí)慣了以往事情一步步的處理,這里我講的一步步的處理,指的是一系列的事件分步進行,比如有如下需求,進入activity之后需要立馬進行如下操作:

先獲取用戶列表》》界面顯示用戶列表

獲取每個用戶的詳細信息》》將列表item設(shè)置為可點擊

獲取每個用戶的頭像》》列表中的用戶頭像顯示出來

對于用戶的頭像進行壓縮》》輸出壓縮成功日志到控制臺

將壓縮后的頭像存儲》》輸出保存成功日志到控制臺

很明顯,這一系列的事件如果按照以往的子線程調(diào)度,然后handler切換更新ui,必定會使代碼變得冗長而那一閱讀,代碼的縮進也將像進入了地獄般,有人會說,以上步驟可以通過服務(wù)器返回足夠恰當?shù)臄?shù)據(jù)一步完成。其實這里僅僅做一個例子,況且有些情況,服務(wù)端人員并不能溝通到的,比如你需要調(diào)用第三方服務(wù)的接口,他們不會為了讓你方便一些就去對他們整個架構(gòu)大動干戈的;

2,問題思考:

既然傳統(tǒng)的方式看起來很麻煩,那么有沒有解決方法?如果目前我們不知道有Rxjava這個東西,讓我們自己去封裝一個處理類似需求的解決方案該怎么辦?我會思考將所有的處理都放到一個線程中去,然后在每一步結(jié)束的時候通過handler更新ui,類似如下偽代碼:

new Thread(new Runnable() {

? ? @Override

? ? public void run() {

? ? ? ? //獲取用戶列表

? ? ? ? List users = getUserList();

? ? ? ? mHander.post(new Runnable() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? showUserList();

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? //獲取每個用戶詳情

? ? ? ? List userDetails = new ArrayList<>();

? ? ? ? for (int i = 0; i < users.size(); i++) {

? ? ? ? ? ? UserDetail userDetail = getUserDetail(users.get(i).getId());

? ? ? ? ? ? userDetails.add(userDetail);

? ? ? ? ? ? final int finalI = i;

? ? ? ? ? ? mHander.post(new Runnable() {

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? ? ? updateListViewClickable(finalI);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? }

? ? ? ? //獲取每個用戶的頭像

? ? ? ? List bitmaps = new ArrayList<>();

? ? ? ? for (int i = 0; i < userDetails.size(); i++) {

? ? ? ? ? ? UserDetail userDetail = userDetails.get(i);

? ? ? ? ? ? final Bitmap bitmap = getUserThumb(userDetail);

? ? ? ? ? ? final int finalI = i;

? ? ? ? ? ? mHander.post(new Runnable() {

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? ? ? updateUserHeader(finalI, bitmap);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? }

? ? ? ? //壓縮圖片

? ? ? ? for (int i = 0; i < bitmaps.size(); i++) {

? ? ? ? ? ? Bitmap bitmap = bitmaps.get(i);

? ? ? ? ? ? final Bitmap cbitmap = compressBitmap(bitmap);

? ? ? ? }

? ? ? ? mHander.post(new Runnable() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? ToastUtils.showShort("壓縮圖片成功");

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? //保存圖片

? ? ? ? for (int i = 0; i < bitmaps.size(); i++) {

? ? ? ? ? ? Bitmap bitmap = bitmaps.get(i);

? ? ? ? ? ? saveBitmap(bitmap);

? ? ? ? }

? ? ? ? mHander.post(new Runnable() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? //更新ui

? ? ? ? ? ? ? ? ToastUtils.showShort("保存圖片成功");

? ? ? ? ? ? }

? ? ? ? });

? ? }

});

這樣做似乎還算簡潔(其中有許多不合理的地方,比如圖片的一些列處理可以一個循環(huán)搞定,這里僅僅做一特例,不必深究),也解決了地獄似得回調(diào),但似乎需要優(yōu)化的地方超級多:

?1,線程的創(chuàng)建與管理,代碼執(zhí)行線程的指定

?2,線程的切換

?3,代碼編寫麻煩

?4,數(shù)據(jù)流處理很不完善

3,基于以上問題的解決:

于是官方出品了自帶線程管理,線程切換,鏈式變成,完善數(shù)據(jù)操作符的Rxjava,如果帶著以上問題再去審視Rxjava會好理解的多吧,那么我們?nèi)绻凑誖xjava的方式實現(xiàn)以上代碼是什么樣子的呢?偽代碼如下:

Observable.create(new ObservableOnSubscribe() {

? ? @Override

? ? public void subscribe(ObservableEmitter emitter) throws Exception {

? ? ? ? //獲取用戶列表

? ? ? ? List users = getUserList();

? ? ? ? emitter.onNext(users);

? ? ? ? //獲取每個用戶詳情

? ? ? ? List userDetails = new ArrayList<>();

? ? ? ? for (int i = 0; i < users.size(); i++) {

? ? ? ? ? ? UserDetail userDetail = getUserDetail(users.get(i).getId());

? ? ? ? ? ? userDetails.add(userDetail);

? ? ? ? ? ? emitter.onNext(i);

? ? ? ? }

? ? ? ? //獲取每個用戶的頭像

? ? ? ? List bitmaps = new ArrayList<>();

? ? ? ? for (int i = 0; i < userDetails.size(); i++) {

? ? ? ? ? ? UserDetail userDetail = userDetails.get(i);

? ? ? ? ? ? final Bitmap bitmap = getUserThumb(userDetail);

? ? ? ? ? ? emitter.onNext(bitmap);

? ? ? ? }

? ? ? ? //壓縮圖片

? ? ? ? for (int i = 0; i < bitmaps.size(); i++) {

? ? ? ? ? ? Bitmap bitmap = bitmaps.get(i);

? ? ? ? ? ? final Bitmap cbitmap = compressBitmap(bitmap);

? ? ? ? }

? ? ? ? emitter.onNext("壓縮圖片成功");

? ? ? ? //保存圖片

? ? ? ? for (int i = 0; i < bitmaps.size(); i++) {

? ? ? ? ? ? Bitmap bitmap = bitmaps.get(i);

? ? ? ? ? ? saveBitmap(bitmap);

? ? ? ? }

? ? ? ? emitter.onNext("保存圖片成功");

? ? }

}).subscribeOn(Schedulers.io())

? ? ? ? .observeOn(AndroidSchedulers.mainThread())

? ? ? ? .subscribe(new Consumer() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void accept(Object object) throws Exception {

? ? ? ? ? ? ? ? //Ui更新

? ? ? ? ? ? }

? ? ? ? });

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 前言我從去年開始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占導(dǎo)zqq閱讀 9,299評論 6 151
  • 我從去年開始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,744評論 7 62
  • 一、 和一個做心理咨詢師的朋友聊到感情問題,她說: “對兩性關(guān)系來說,最具毀滅性的想法之一就是:如果我們需要努力,...
    羽扇清風(fēng)閱讀 779評論 0 1
  • 世界千百樣圖畫,但你我也只渴望回家。 ——鄧紫棋 《Victoria》 老喵誒: 歲月如流,算上生物學(xué)上對人...
    Sakura_Iceland閱讀 196評論 0 0

友情鏈接更多精彩內(nèi)容