ReactiveX
是一個專注于異步編程與控制可觀察數(shù)據(jù)(或者事件)流的API。它組合了觀察者模式徐裸,迭代器模式和函數(shù)式編程的優(yōu)秀思想女器。
實時數(shù)據(jù)處理是一件普通的現(xiàn)象诀蓉,有一個高效犯助、干凈和可擴展的方式來處理這些情景是重要的癣漆。使用 Observables 和 Operators 來熟練操作它們。ReactiveX 提供一個可組合又靈活的 API 來創(chuàng)建和處理數(shù)據(jù)流剂买,同時簡化了異步編程帶來的一些擔(dān)憂扑媚,如:線程創(chuàng)建和并發(fā)問題。
RxJava 簡介
是 ReactiveX 在 Java 上的開源的實現(xiàn)雷恃。Observable(觀察者) 和 Subscriber(訂閱者)是兩個主要的類。在 RxJava 上费坊,一個 Observable 是一個發(fā)出數(shù)據(jù)流或者事件的類倒槐,Subscriber 是一個對這些發(fā)出的 items (數(shù)據(jù)流或者事件)進行處理(采取行動)的類。一個 Observable 的標(biāo)準(zhǔn)流發(fā)出一個或多個 item附井,然后成功完成或者出錯讨越。一個 Observable 可以有多個 Subscribers两残,并且通過 Observable 發(fā)出的每一個 item,該 item 將會被發(fā)送到 Subscriber.onNext() 方法來進行處理把跨。一旦 Observable 不再發(fā)出 items人弓,它將會調(diào)用 Subscriber.onCompleted() 方法,或如果有一個出錯的話 Observable 會調(diào)用 Subscriber.onError() 方法着逐。
以前我們要想在activity或fragment之間傳遞信息崔赌,我們會通過onActvityResult接收信息。但是這樣有一個缺點耸别,一個是代碼量太大健芭,重復(fù)率太高。二是有時候傳遞的數(shù)據(jù)需要經(jīng)過幾個界面的跳轉(zhuǎn)秀姐。加入從A->B->C慈迈,C界面修改了某些信息,同時省有,想在A界面進行界面的刷新痒留。那么通過onActvityResult的話很難操作。還有就是蠢沿,加入從A->B伸头,B傳遞信息給A界面。以往通過onActvityResult搏予,我們需要在B界面關(guān)閉的時候熊锭,A界面才能拿到數(shù)據(jù),再進行局部刷新雪侥,這樣的話碗殷,A界面很可能會閃爍(數(shù)據(jù)刷新)。這樣的話用戶體驗感就很差了速缨。
使用方法
首先锌妻,附上RxJava/RxAndroid的導(dǎo)包連接,也可以去gitHub上添加最新的版本鏈接
implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'io.reactivex:rxjava:1.2.4'
首要要創(chuàng)建一個RxBus類旬牲,來實現(xiàn)基本的方法封裝仿粹,下面貼出來一個簡單示例:
public class RxBus {
private static volatile RxBus instance;
private Subject<Object , Object> bus;
/**
* PublishSubject只會把在訂閱發(fā)生的時間點之后來自原始Observable的數(shù)據(jù)發(fā)射給觀察者
*/
public RxBus () {
bus = new SerializedSubject<>(PublishSubject.create());
}
public static RxBus getDefault(){
if (instance ==null){
synchronized (RxBus .class){
if (instance == null){
instance = new RxBus ();
}
}
}
return instance;
}
/**
* 發(fā)送一個新的事件
* @param object
*/
public void post(Object object){
bus.onNext(object);
}
/**
* 根據(jù)傳遞的 eventType 類型返回特定類型(eventType)的 被觀察者
*/
public <T> Observable<T> toObservable(Class<T> eventType){
return bus.ofType(eventType);
}
}
完成上面一個小示例的封裝,那么怎么來使用呢原茅?
要在我們使用的位置要進行訂閱吭历,添加訂閱之后,這樣就可以接受其他位置發(fā)來的數(shù)據(jù)data了擂橘。
RxBus.getDefault().toObservable(RxBusXunHeBean.class)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<RxBusXunHeBean>() {
@Override
public void call(Bean mBean) {
//此處的bean就是攜帶數(shù)據(jù)的實體晌区,可以是你想要的任何數(shù)據(jù)類型,都是沒有問題的。
}
});
攜帶數(shù)據(jù)的實體Bean朗若,我就不在此處貼代碼了恼五,要是有不懂的話初學(xué)者,可以留言或者微信聯(lián)系我哭懈。
最后一步灾馒,有了攜帶數(shù)據(jù)的實體,又有了接受數(shù)據(jù)的位置遣总,接下來睬罗,就是數(shù)據(jù)的發(fā)送了,因為RxBus中封裝了post方法彤避,在此處傅物,我們直接調(diào)用就可以了。
public class Test1Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test1);
initView();
}
private void initView() {
Bean bean= new Bean("android-RxBus","不一樣的煙火");
RxBus.getDefault().post(bean);
}
}
以上琉预,就是一個很簡單的RxBus的使用方法了董饰,歡迎大家批評指正。