轉(zhuǎn)載請(qǐng)注明出處:
http://www.blog.csdn.net/zhyxuexijava/article/details/51597230.com
前段時(shí)間看了MVP架構(gòu)和RxJava,最近也在重構(gòu)一些項(xiàng)目(MVC架構(gòu))华畏,于是寫一個(gè)簡單的例子缆巧,好了钱反,廢不多說了蹦肴,入坑開始福扬。
一.RxJava是什么?
GitHub(https://github.com/ReactiveX/RxJava)上是這樣解釋的:
RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.
RxJava是一個(gè)在Java虛擬機(jī)上的Reactive擴(kuò)展程序:在Java虛擬機(jī)上使用可觀測(cè)的序列來組成異步的菱父,基于事件的程序的庫挣饥。
簡單的說:RxJava其實(shí)可以理解為一個(gè)普通的Java庫。它的本質(zhì)就是異步地回。
二.為什么要使用RxJava
兩個(gè)字:簡潔扁远。它的異步調(diào)用隨著程序邏輯變得越來越復(fù)雜,它的鏈?zhǔn)秸{(diào)用依然能夠保持簡潔刻像。
三.API介紹和原理解析
1.概念
RxJava 的異步實(shí)現(xiàn)畅买,是通過一種擴(kuò)展的觀察者模式來實(shí)現(xiàn)的。從純Java的觀點(diǎn)來看细睡,RxJava Observable類源自于經(jīng)典的觀察者模式谷羞。
它添加了三個(gè)缺少的功能:
- 生產(chǎn)者在沒有更多數(shù)據(jù)可用時(shí)能夠發(fā)出通知信號(hào):onCompleted事件。
- 生產(chǎn)者在發(fā)生錯(cuò)誤時(shí)能夠發(fā)出通知信號(hào):onError()事件溜徙。
- RxJava Observables能夠組合而不是嵌套湃缎,從而避免開發(fā)者陷入回調(diào)的地獄。
那么我們什么時(shí)候使用觀察者模式(題外話)蠢壹?
- 當(dāng)你的架構(gòu)有兩個(gè)實(shí)體類嗓违,一個(gè)依賴另外一個(gè),你想讓它們互不影響或者是獨(dú)立復(fù)用它們图贸。
- 當(dāng)一個(gè)變化的對(duì)象通知那些與它自身變化相關(guān)聯(lián)的未知數(shù)量的對(duì)象時(shí)蹂季。
- 當(dāng)一個(gè)變化的對(duì)象通知那些無需推斷具體的對(duì)象是誰。
RxJava的觀察者模式:
Observable (被觀察者)疏日、 Observer (觀察者)乏盐、 subscribe (訂閱)。Observable 和 Observer 通過 subscribe() 方法實(shí)現(xiàn)訂閱關(guān)系制恍,從而 Observable 可以在需要的時(shí)候發(fā)出事件來通知 Observer父能。
RxJava的回調(diào)方法主要有三個(gè),onNext()净神,onError(),onCompleted()何吝。
- onNext() 對(duì)于Subscribler我們可以理解為接收數(shù)據(jù)溉委。
- onCompleted() 觀測(cè)的事件的隊(duì)列任務(wù)都完成了,當(dāng)不再有onNext()發(fā)射數(shù)據(jù)時(shí)爱榕,onCompleted事件被觸發(fā)瓣喊。
- onError() 當(dāng)事件異常時(shí)響應(yīng)此方法,一旦此方法被觸發(fā)黔酥,隊(duì)列自動(dòng)終止藻三,不再發(fā)射任何數(shù)據(jù)。
(其實(shí)onCompleted()和onError()我們可以理解為網(wǎng)絡(luò)請(qǐng)求框架中的onSuccess()和onError(),一個(gè)是服務(wù)器響應(yīng)成功跪者,一個(gè)是響應(yīng)失敗棵帽,這兩個(gè)方法同時(shí)只有一個(gè)能夠被執(zhí)行,onCompleted()和onError()同理,onNext()可以理解為客戶端接收數(shù)據(jù)渣玲,不同的是服務(wù)器必須一次性返回響應(yīng)信息逗概,而RxJava可以一個(gè)一個(gè)數(shù)據(jù)返回或者一次性返回整個(gè)列表之類的)
4.實(shí)踐
下面舉個(gè)例子:
package com.test.rxjava;
import android.os.Bundle; import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
public class MainActivity extends AppCompatActivity {
@Bind(R.id.tv_show)
TextView tvShow;
@Bind(R.id.btnChange)
Button btnChange;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ButterKnife.unbind(this);
}
@OnClick({R.id.btnChange})
public void click(View v){
changeView(); //改變TextView的內(nèi)容,初始值為Hello wORLD
}
private void changeView() {
/**忘衍,被觀察者**/
Observable<String> myObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello Reactive Android!!");
subscriber.onCompleted();
}
}
);
/**接觀察者**/
Subscriber<String> mySubscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
Toast.makeText(MainActivity.this, "更換內(nèi)容成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
Toast.makeText(MainActivity.this, "更換內(nèi)容失敗", Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(String s) {
Log.d("danxx", "onNext--->" + s);
tvShow.setText(s.toString());
}
};
/**訂閱事件**/
myObservable.observeOn(AndroidSchedulers.mainThread()).subscribe(mySubscriber);
} }
在builde.gradle中的配置配置:
運(yùn)行結(jié)果:
說明:1.observeOn(AndroidSchedulers.mainThread())主要是由于android必須在主線程中更新UI
2.本例中用了ButterKnife。(這里就不多講了枚钓,不會(huì)的自行Google)
今天就寫到這里了铅搓,主要介紹了一些基礎(chǔ)概念和寫了一個(gè)例子,接下來的文章我將結(jié)合項(xiàng)目重構(gòu)來深入理解RxJava搀捷。
第一次在簡書上發(fā)文章狸吞,大家多多包涵,如果大家可憐我這個(gè)熬夜狗指煎,可以打賞一點(diǎn)蹋偏,您的支持是我不斷進(jìn)步的動(dòng)力。