真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

一文帶你全面了解RxJava-創(chuàng)新互聯(lián)

工作需要,剛好在學(xué)習(xí) RxJava網(wǎng)絡(luò)請求框架,網(wǎng)上搜了一些 關(guān)于RxJava 的教程,但都并不是很好理解,所幸最后找到了幾篇有助于初學(xué)者了解 RxJava 的文章,于是結(jié)合自己的理解,重新整理成一篇發(fā)給大家,希望通過我的咀嚼,能夠幫助大家更快的了解和上手 RxJava,話不多說,進入正文吧!

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出懷安免費做網(wǎng)站回饋大家。

1.什么是RxJava
? Rx是Reactive Extensions的簡寫,翻譯為響應(yīng)的擴展。也就是通過由一方發(fā)出信息,另一方響應(yīng)信息并作出處理的核心框架代碼。
? 該框架由微軟的架構(gòu)師Erik Meijer領(lǐng)導(dǎo)的團隊開發(fā),并在2012年11月開源。
? Rx庫支持.NET、JavaScript和C++等,現(xiàn)在已經(jīng)支持幾乎全部的流行編程語言了。
? Rx的大部分語言庫由ReactiveX這個組織負責維護,比較流行的有RxJava/RxJS/Rx.NET,社區(qū)網(wǎng)站是 reactivex.io。
? RxJava作為一個流行的框架,其源碼依托在GitHub,除了支持RxJava,針對安卓系統(tǒng)也除了一個支持框架RxAndroid
2.RxJava簡化代碼
一般我們在安卓項目中,如果想從后臺獲取數(shù)據(jù)并刷新界面,代碼大概如下,下面我們來看一個例子:
new Thread() {@Override
br/>@Override
super.run();
for (File folder : folders) {
File[] files = folder.listFiles();
for (File file : files) {
if (file.getName().endsWith(".png")) {
final Bitmap bitmap = getBitmapFromFile(file);
getActivity().runOnUiThread(new Runnable() {@Override
br/>@Override
imageCollectorView.addImage(bitmap);
}
});
}
}
}
}
}.start();
上面的代碼經(jīng)過多層嵌套后 可讀性太差了!如果你用了RxJava 可以這樣寫:
Observable.from(folders)
.flatMap(new Func1>() {@Override
br/>@Override
call(File file) {
return Observable.from(file.listFiles());
}
})
.filter(new Func1() {@Override
br/>@Override
return file.getName().endsWith(".png");
}
})
.map(new Func1() {@Override
br/>@Override
return getBitmapFromFile(file);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1() {@Override
br/>@Override
imageCollectorView.addImage(bitmap);
}
});
這樣寫的好處就是減少層次嵌套 提高了代碼的可讀性,除了簡化代碼,RxJava還可以為每個方法提供特定的運行線程。

3.引入框架
目前RxJava已經(jīng)升級為2.0版本,但為了能夠更好的理解RxJava,我們可以從1.0版本開始學(xué)習(xí)。也為了讓我們的安卓項目能夠更好的使用RxJava,可以在項目中引入gradle腳本依賴:
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
現(xiàn)在 我們的項目已經(jīng)支持RxJava的功能了。
4.響應(yīng)式的核心
所謂的響應(yīng)式,無非就是存在這樣的2個部分,一部分負責發(fā)送事件/消息,另一部分負責響應(yīng)事件/消息。
以前如果我們想看新聞,一般需要通過看報紙。比如,你對某個報刊雜志比較感興趣,那么你首先要做3件事:

  1. 提供你家的地址
  2. 找到對應(yīng)的報社
  3. 去報社訂閱整個月的報紙
    經(jīng)過了上面的流程,以后每天只要有新的報刊資料出來了,報社都會將雜志發(fā)送到你家。
    一文帶你全面了解RxJava
    將上面的例子進行代碼抽象,步驟如下:
  4. 提供觀察者(因為你是關(guān)心雜志內(nèi)容的人 所以你是觀察該事件的人)
  5. 提供被觀察者(只要有新的雜志出來 就需要通知關(guān)心的人 所以報社是被觀察的對象)
  6. 訂閱(也就是 觀察者&被觀察者之間要相互關(guān)聯(lián) 以便被觀察的對象一變化 就會馬上通知觀察該事件的對象)
    一文帶你全面了解RxJava
    上面示例的演示代碼如下:
    //1.創(chuàng)建被觀察者
    Observable observable =
    Observable.create(new Observable.OnSubscribe() {@Override
    br/>@Override
    subscriber) {
    //4.開始發(fā)送事件
    //事件有3個類型 分別是onNext() onCompleted() onError()
    //onCompleted() onError() 一般都是用來通知觀察者 事件發(fā)送完畢了,兩者只取其一。
    subscriber.onNext("Hello Android !");
    subscriber.onNext("Hello Java !");
    subscriber.onNext("Hello C !");
    subscriber.onCompleted();
    }
    });

    //2.創(chuàng)建觀察者
    Subscriber subscriber = new Subscriber() {@Override
    br/>@Override
    Log.i(TAG, "onCompleted ");
    }

    @Override
    public void onError(Throwable e) {
        Log.i(TAG, "onError: "+e.getLocalizedMessage());
    }
    
    @Override
    public void onNext(String s) {
        Log.i(TAG, "onNext: "+s);
    }

    };

    //3.訂閱
    observable.subscribe(subscriber);
    輸出如下:
    com.m520it.rxjava I/IT520: onNext: Hello Android !
    com.m520it.rxjava I/IT520: onNext: Hello Java !
    com.m520it.rxjava I/IT520: onNext: Hello C !
    com.m520it.rxjava I/IT520: onCompleted
    代碼運行的原理
    ? 上面的代碼中,當觀察者subscriber訂閱了被觀察者observable之后,系統(tǒng)會自動回調(diào)observable對象內(nèi)部的call()。
    ? 在observable的call()方法實體中,發(fā)送了如onNext/onCompleted/onError事件后。
    ? 接著subscriber就能回調(diào)到到對應(yīng)的方法。
    5.被觀察者變種
    普通的Observable發(fā)送需要三個方法onNext, onError, onCompleted,而Single作為Observable的變種,只需要兩個方法:
    ? onSuccess - Single發(fā)射單個的值到這個方法
    ? onError - 如果無法發(fā)射需要的值,Single發(fā)射一個Throwable對象到這個方法
    Single只會調(diào)用這兩個方法中的一個,而且只會調(diào)用一次,調(diào)用了任何一個方法之后,訂閱關(guān)系終止。
    final Single single = Single.create(new Single.OnSubscribe() {@Override
    br/>@Override
    singleSubscriber) {
    //先調(diào)用onNext() 最后調(diào)用onCompleted()
    //singleSubscriber.onSuccess("Hello Android !");
    //只調(diào)用onError();
    singleSubscriber.onError(new NullPointerException("mock Exception !"));
    }
    });

    Observer observer = new Observer() {@Override
    br/>@Override
    Log.i(TAG, "onCompleted ");
    }

    @Override
    public void onError(Throwable e) {
        Log.i(TAG, "onError: "+e.getLocalizedMessage());
    }
    
    @Override
    public void onNext(String s) {
        Log.i(TAG, "onNext: "+s);
    }

    };
    single.subscribe(observer);
    6.觀察者變種
    Observer觀察者對象,上面我們用Subscriber對象代替。因為該對象本身就是繼承了Observer。
    該對象實現(xiàn)了onNext()&onCompleted()&onError()事件,我們?nèi)绻麑δ膫€事件比較關(guān)心,只需要實現(xiàn)對應(yīng)的方法即可,代碼如下:
    //創(chuàng)建觀察者
    Subscriber subscriber = new Subscriber() {@Override
    br/>@Override
    Log.i(TAG, "onCompleted ");
    }

    @Override
    public void onError(Throwable e) {
        Log.i(TAG, "onError: "+e.getLocalizedMessage());
    }
    
    @Override
    public void onNext(String s) {
        Log.i(TAG, "onNext: "+s);
    }

    };

    //訂閱
    observable.subscribe(subscriber);
    上面的代碼中,如果你只關(guān)心onNext()事件,但卻不得不實現(xiàn)onCompleted()&onError()事件.這樣的代碼就顯得很臃腫。鑒于這種需求,RxJava框架在訂閱方面做了特定的調(diào)整,代碼如下:
    //為指定的onNext事件創(chuàng)建獨立的接口
    Action1 onNextAction = new Action1() {@Override
    br/>@Override
    Log.i(TAG, "call: "+s);
    }
    };

    //訂閱
    observable.subscribe(onNextAction);

不知道大家注意到?jīng)]有,subscribe()訂閱的不再是觀察者,而是特定的onNext接口對象。類似的函數(shù)如下,我們可以根據(jù)需要實現(xiàn)對應(yīng)的訂閱:

public Subscription subscribe(final Observer observer)
public Subscription subscribe(final Action1 onNext)
public Subscription subscribe(final Action1 onNext, Action1 onError)
public Subscription subscribe(final Action1 onNext, Action1 onError, Action0 onCompleted)

這里還有一個forEach函數(shù)有類似的功能:

public void forEach(final Action1 onNext)
public void forEach(final Action1 onNext, Action1 onError)
public void forEach(final Action1 onNext, Action1 onError, Action0 onComplete)

##7.Subject變種

上面2節(jié)中既介紹了被觀察者變種,又介紹了觀察者變種,這里再介紹一種雌雄同體的對象(既作為被觀察者使用,也可以作為觀察者)。

針對不同的場景一共有四種類型的Subject。他們并不是在所有的實現(xiàn)中全部都存在。

###AsyncSubject

一個AsyncSubject只在原始Observable完成后,發(fā)射來自原始Observable的最后一個值。它會把這最后一個值發(fā)射給任何后續(xù)的觀察者。

以下貼出代碼:
//創(chuàng)建被觀察者final AsyncSubject subject = AsyncSubject.create();//創(chuàng)建觀察者
Subscriber subscriber = new Subscriber() {@Override
br/>@Override
Log.i(TAG, "onCompleted");
}

@Override
public void onError(Throwable e) {
    Log.i(TAG, "onError");
}

@Override
public void onNext(String s) {
    Log.i(TAG, "s:" + s);

}

};//訂閱事件
subject.subscribe(subscriber);//被觀察者發(fā)出事件 如果調(diào)用onCompleted(),onNext()則會打印最后一個事件;如果沒有,onNext()則不打印任何事件。
subject.onNext("Hello Android ");
subject.onNext("Hello Java ");
subject.onCompleted();
輸出:
s:Hello Java onCompleted
然而,如果原始的Observable因為發(fā)生了錯誤而終止,AsyncSubject將不會發(fā)射任何數(shù)據(jù),只是簡單的向前傳遞這個錯誤通知。

上面的觀察者被觀察者代碼相同,現(xiàn)在發(fā)出一系列信號,并在最后發(fā)出異常 代碼如下:

subject.onNext("Hello Android ");
subject.onNext("Hello Java ");//因為發(fā)送了異常 所以onNext()無法被打印
subject.onError(null);
###BehaviorSubject

當觀察者訂閱BehaviorSubject時,他會將訂閱前最后一次發(fā)送的事件和訂閱后的所有發(fā)送事件都打印出來,如果訂閱前無發(fā)送事件,則會默認接收構(gòu)造器create(T)里面的對象和訂閱后的所有事件,代碼如下:
BehaviorSubject subject=BehaviorSubject.create("NROMAL");

Subscriber subscriber = new Subscriber() {@Override
br/>@Override
Log.i(TAG, "onCompleted");
}

@Override
public void onError(Throwable e) {
    Log.i(TAG, "onError");
}

@Override
public void onNext(Object o) {
    Log.i(TAG, "onNext: " + o);
}

};
//subject.onNext("Hello Android !");//subject.onNext("Hello Java !");//subject.onNext("Hello C !");//這里開始訂閱 如果上面的3個注釋沒去掉,則Hello C的事件和訂閱后面的事件生效//如果上面的三個注釋去掉 則打印構(gòu)造器NORMAL事件生效后和訂閱后面的事件生效
subject.subscribe(subscriber);

subject.onNext("Hello CPP !");
subject.onNext("Hello IOS !");
PublishSubject

PublishSubject只會把在訂閱發(fā)生的時間點之后來自原始Observable的數(shù)據(jù)發(fā)射給觀察者。

需要注意的是,PublishSubject可能會一創(chuàng)建完成就立刻開始發(fā)射數(shù)據(jù),因此這里有一個風(fēng)險:在Subject被創(chuàng)建后到有觀察者訂閱它之前這個時間段內(nèi),一個或多個數(shù)據(jù)可能會丟失。

代碼如下:
PublishSubject subject= PublishSubject.create();

Action1 onNextAction1 = new Action1(){

@Override
public void call(String s) {
    Log.i(TAG, "onNextAction1 call: "+s);
}

};

Action1 onNextAction2 = new Action1(){

@Override
public void call(String s) {
    Log.i(TAG, "onNextAction2 call: "+s);
}

};

subject.onNext("Hello Android !");
subject.subscribe(onNextAction1);
subject.onNext("Hello Java !");
subject.subscribe(onNextAction2);
subject.onNext("Hello IOS !");

輸出如下:

onNextAction1 call: Hello Java !
onNextAction1 call: Hello IOS !
onNextAction2 call: Hello IOS !
ReplaySubject

ReplaySubject會發(fā)射所有來自原始Observable的數(shù)據(jù)給觀察者,無論它們是何時訂閱的。

代碼如下:

ReplaySubject subject= ReplaySubject.create();

Action1 onNextAction1 = new Action1(){

@Override
public void call(String s) {
    Log.i(TAG, "onNextAction1 call: "+s);
}

};

Action1 onNextAction2 = new Action1(){

@Override
public void call(String s) {
    Log.i(TAG, "onNextAction2 call: "+s);
}

};

subject.onNext("Hello Android !");
subject.subscribe(onNextAction1);
subject.onNext("Hello Java !");
subject.subscribe(onNextAction2);
subject.onNext("Hello IOS !");

輸出如下:

onNextAction1 call: Hello Android !
onNextAction1 call: Hello Java !
onNextAction2 call: Hello Android !
onNextAction2 call: Hello Java !
onNextAction1 call: Hello IOS !
onNextAction2 call: Hello IOS !
###Subject總結(jié)

AsyncSubject無論何時訂閱 只會接收最后一次onNext()事件,如果最后出現(xiàn)異常,則不會打印任何onNext()
BehaviorSubject會從訂閱前最后一次oNext()開始打印直至結(jié)束。如果訂閱前無調(diào)用onNext(),則調(diào)用默認creat(T)傳入的對象。如果異常后才調(diào)用,則不打印onNext()
PublishSubject只會打印訂閱后的任何事件。
ReplaySubject無論訂閱在何時都會調(diào)用發(fā)送的事件。

以上就是我了解的關(guān)于RxJava的入門相關(guān)知識,如果你還有其他相關(guān)的干貨分享,還望補充。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


新聞名稱:一文帶你全面了解RxJava-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://www.weahome.cn/article/dighse.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部