RxJava+RxAndroid+MVP入坑實踐(基礎篇)

轉載請註明出處:http://www.blog.csdn.net/zhyxuexijava/article/details/51597230.comjava

前段時間看了MVP架構和RxJava,最近也在重構一些項目(MVC架構),因而寫一個簡單的例子,好了,廢很少說了,入坑開始。android

一.RxJava是什麼?git

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.github

RxJava是一個在Java虛擬機上的Reactive擴展程序:在Java虛擬機上使用可觀測的序列來組成異步的,基於事件的程序的庫。服務器

簡單的說:RxJava其實能夠理解爲一個普通的Java庫。它的本質就是異步。網絡

二.爲何要使用RxJava架構

兩個字:簡潔。它的異步調用隨着程序邏輯變得愈來愈複雜,它的鏈式調用依然可以保持簡潔。app

三.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中的配置配置:
這裏寫圖片描述

運行結果:

初始運行APP

點擊Button,Observable發射事件,Sunscriber接受事件

說明:1.observeOn(AndroidSchedulers.mainThread())主要是因爲android必須在主線程中更新UI 2.本例中用了ButterKnife。

相關文章
相關標籤/搜索