RxJava+RxAndroid+MVP入坑實踐(一:基礎篇)
前段時間看了MVP架構和RxJava,最近也在重構一些專案(MVC架構),於是寫一個簡單的例子,好了,廢不多說了,入坑開始。
一.RxJava是什麼?
GitHub([https://github.com/ReactiveX/RxJava])(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是一個在Java虛擬機器上的Reactive擴充套件程式:在Java虛擬機器上使用可觀測的序列來組成非同步的,基於事件的程式的庫。
簡單的說:RxJava其實可以理解為一個普通的Java庫。它的本質就是非同步。
二.為什麼要使用RxJava
兩個字:簡潔。它的非同步呼叫隨著程式邏輯變得越來越複雜,它的鏈式呼叫依然能夠保持簡潔。
三.API介紹和原理解析
1.概念
RxJava 的非同步實現,是通過一種擴充套件的觀察者模式來實現的。從純Java的觀點來看,RxJava Observable類源自於經典的觀察者模式。
它添加了三個缺少的功能:
- 生產者在沒有更多資料可用時能夠發出通知訊號:onCompleted事件。
- 生產者在發生錯誤時能夠發出通知訊號:onError()事件。
- RxJava Observables能夠組合而不是巢狀,從而避免開發者陷入回撥的地獄。
那麼我們什麼時候使用觀察者模式(題外話)?
- 當你的架構有兩個實體類,一個依賴另外一個,你想讓它們互不影響或者是獨立複用它們。
- 當一個變化的物件通知那些與它自身變化相關聯的未知數量的物件時。
- 當一個變化的物件通知那些無需推斷具體的物件是誰。
RxJava的觀察者模式:
Observable (被觀察者)、 Observer (觀察者)、 subscribe (訂閱)。Observable 和 Observer 通過 subscribe() 方法實現訂閱關係,從而 Observable 可以在需要的時候發出事件來通知 Observer。
RxJava的回撥方法主要有三個,onNext(),onError(),onCompleted()。
- onNext() 對於Subscribler我們可以理解為接收資料。
- onCompleted() 觀測的事件的佇列任務都完成了,當不再有onNext()發射資料時,onCompleted事件被觸發。
- onError() 當事件異常時響應此方法,一旦此方法被觸發,佇列自動終止,不再發射任何資料。
(其實onCompleted()和onError()我們可以理解為網路請求框架中的onSuccess()和onError(),一個是伺服器響應成功,一個是響應失敗,這兩個方法同時只有一個能夠被執行,onCompleted()和onError()同理,onNext()可以理解為客戶端接收資料,不同的是伺服器必須一次性返回響應資訊,而RxJava可以一個一個數據返回或者一次性返回整個列表之類的)
4.實踐
下面舉個例子:
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的內容,初始值為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, "更換內容成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
Toast.makeText(MainActivity.this, "更換內容失敗", 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中的配置配置:
執行結果:
說明:1.observeOn(AndroidSchedulers.mainThread())主要是由於android必須在主執行緒中更新UI
2.本例中用了ButterKnife。(這裡就不多講了,不會的自行Google)
今天就寫到這裡了,主要介紹了一些基礎概念和寫了一個例子,接下來的文章我將結合專案重構來深入理解RxJava。
第一次在csdn上寫文章,大家多多包涵,如果大家可憐我這個熬夜狗,可以打賞一點,您的支援是我不斷進步的動力。
向“胖胖你要好好敲程式碼”轉賬