在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    Android架構師RX響應式編程-Rxjava實戰(zhàn)項目教學

    Android架構師RX響應式編程-Rxjava實戰(zhàn)項目教學

    RX定義

    • Rx是一個函數(shù)庫,讓開發(fā)者可以利用可觀察序列和LINQ風格查詢操作符來編寫異步和基于事件程序
    • Rx是微軟.NET的一個響應式擴展。Rx借助可觀測的序列提供一種簡單的方式來創(chuàng)建異步的,基于事件驅動的程序。
    • Rx就是一種響應式編程,來創(chuàng)建基于事件的異步程序

    RXJava簡介

    RxJava就是一種用Java語言實現(xiàn)的響應式編程,來創(chuàng)建基于事件的異步程序

    官方定義:一個在 Java VM 上使用可觀測的序列來組成異步的、基于事件的程序的庫

    RXJava原理

    • RxJava: 基于 一種擴展的觀察者模式
    • RxJava的擴展觀察者模式中有4個角色:

    簡單使用方法

    代碼示例

    Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) throws Exception { emitter.onNext(1); emitter.onComplete(); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, “accept integer = ” + integer); } });

    解釋說明:

    • 創(chuàng)建被觀察者,發(fā)送事件,即emitter.onNext(1),發(fā)送了數(shù)字1;
    • 指定被觀察者的執(zhí)行線程,Schedulers.io();
    • 觀察者處理接收到的數(shù)據(jù);
    • 切換線程到主線程,觀察者將在主線程處理這些數(shù)據(jù)。

    實戰(zhàn)項目解析

    添加依賴

    compile ‘io.reactivex.rxjava2:rxjava:2.0.0-RC5’compile ‘io.reactivex.rxjava2:rxandroid:2.0.0-RC1’

    基理

    Observable和Observer通過subscribe()方法實現(xiàn)訂閱關系; Rxjava中是**自動發(fā)送事件**的, 一旦**訂閱**就開始**發(fā)送**;


    基本使用三個步驟

    • 第一步,創(chuàng)建Observable, Emitter是發(fā)射器的意思, 在subscribe方法中不斷調(diào)用發(fā)射器的方法; 總共有onNext()、onComplete()、onError()三個方法; 用法參考Rxjava1:
    • 第二步,創(chuàng)建Observer, 總共有onNext()、onComplete()、onError()、onSubscribe()四個方法; 其中,**onNext()、onComplete()、onError()**三個方法分別對應著第一步中**Observable**的**onNext()、onComplete()、onError()**三個方法, 只要**Observable**發(fā)出(調(diào)用)對應的方法, **Observer**對應的方法就會被調(diào)用;
    • onError()和onComplete是互斥的,一次只能調(diào)用一個;
    • 第三步,訂閱, observable.subscribe(observer);

    下面開始實戰(zhàn)內(nèi)容

    • 在app/build.gradle中添加依賴:

    dependencies { implementation fileTree(dir: ‘libs’, include: [‘*.jar’]) implementation ‘com.android.support:appcompat-v7:28.0.0’ implementation ‘io.reactivex.rxjava2:rxjava:2.0.0-RC5’ implementation ‘io.reactivex.rxjava2:rxandroid:2.0.0-RC1’ implementation ‘com.squareup.retrofit2:retrofit:2.1.0’ implementation ‘com.squareup.retrofit2:converter-gson:2.1.0’// compile ‘com.squareup.retrofit2:adapter-rxjava:2.1.0’// compile ‘com.jakewharton.rxbinding:rxbinding:0.4.0’}

    activity_main.xml:

    MainActivity,java: 第一步,通過create()創(chuàng)建Observable(模擬對象:程序員), 通過onNext()發(fā)送數(shù)據(jù):

    public Observable getObservable() { return Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { e.onNext(“奏笛”); e.onNext(“泡吧”); e.onComplete(); } }); }

    第二步,創(chuàng)建Observer(模擬對象:程序員女朋友), 創(chuàng)建的方法是直接new:

    public Observer getObserver(){ return new Observer() { @Override public void onSubscribe(Disposable d) { Log.d(“MainActivity”,”onSubscribe”); } @Override public void onNext(String value) { Log.d(“MainActivity”,”onNext”); } @Override public void onError(Throwable e) { Log.d(“MainActivity”,”onError”); } @Override public void onComplete() { Log.d(“MainActivity”,”onComplete”); } }; }

    第三步,在click()中, getObservable和observer, 實現(xiàn)訂閱:

    public void click(View view) { Observable observale = getObservable(); Observer observer = getObserver(); observale.subscribe(observer); }

    以上便完成了一個最基本的使用; 運行效果:

    點擊按鈕后打印日志:

    由此可以應證, Rxjava中是自動發(fā)送事件的, 一旦Observable 被 observer 訂閱了(observale.subscribe(observer);), Observable就開始發(fā)送; 由Observable通過自身ObservableOnSubscribe中的subscribe()中的 onNext()等方法自動發(fā)出信息, observer接收到信息后執(zhí)行對應的onNext()等方法; 在訂閱之后,Observer中, onSubscribe()是每次接收數(shù)據(jù)之前必須要調(diào)用的方法; onNext()則是對應Observable調(diào)用的次數(shù)去調(diào)用相應的次數(shù); onComplete()、onError()對應完成/異常狀態(tài)時候調(diào)用;

    @Override public void onSubscribe(Disposable d) { Log.d(“MainActivity”,”onSubscribe”); }

    接下來關注一下Observer構造方法中的onSubscribe()方法;

    其中注意參數(shù)Disposable d,

    Disposable是一次性的意思; 其主要有以下兩個方法:

    用法示例 (用于監(jiān)聽Observable發(fā)送的數(shù)據(jù), 如果Observable發(fā)送的數(shù)據(jù)等于某個值, 就斷絕訂閱關系):

    更改Observable代碼:

    public Observable getObservable() { return Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { e.onNext(“奏笛”); e.onNext(“泡吧”); e.onNext(“酗酒”); e.onComplete(); } }); }

    運行示例,點擊按鈕:

    可以發(fā)現(xiàn)已經(jīng)沒有onComplete()方法的打印信息了, 因為在onNext()中途已經(jīng)斷絕訂閱關系了;

    另外還有省略observer的簡潔寫法

    public void click(View view) { Observable observale = getObservable(); observale.subscribe(new Consumer() { @Override public void accept(String s) throws Exception { if(s.equals(“奏笛”)){ Log.d(“MainActivity”,”收到奏笛?。∵@里類似于Observer的onNext()”); } if(s.equals(“吟詩”)){ Log.d(“MainActivity”,”收到吟詩?。∵@里類似于Observer的onNext()”); } if(s.equals(“酗酒”)){ Log.d(“MainActivity”,”收到酗酒?。∵@里類似于Observer的onNext()”); } } }, new Consumer() { @Override public void accept(Throwable throwable) throws Exception { Log.d(“MainActivity”,”這里類似于Observer的onError()”); } }, new Action() { @Override public void run() throws Exception { Log.d(“MainActivity”,”這里類似于Observer的onComplete()”); } }); } public Observable getObservable() { return Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { e.onNext(“奏笛”); e.onNext(“吟詩”); e.onNext(“酗酒”); e.onComplete(); } }); }

    運行示例,點擊按鈕:

    更改上面代碼,

    用Observable.just()創(chuàng)建Observable對象,

    效果也是一樣的; 運行示例,點擊按鈕,打印日志同上:

    public Observable getObservable() { Observable observable = Observable.just(“奏笛”,”吟詩”,”酗酒”); return observable; }

    或者顯示在TextView上:

    用Observable.fromArray()創(chuàng)建Observable對象,

    Observable observable = Observable.fromArray(“奏笛”,”泡吧”,”吟詩”); 其實用法跟**just()**是一樣的; **just()**源碼如下, 里面最終也是調(diào)用**fromArray()**實現(xiàn)的:

    用Observable.fromCallable()創(chuàng)建Observable對象

    特點:只能返回一個數(shù)據(jù);

    本節(jié)筆記Activity全文(注意io.reactivex包的引用):

    package com.cniao5.cniao5rxjava2demo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.TextView;import java.util.concurrent.Callable;import io.reactivex.Observable;import io.reactivex.ObservableEmitter;import io.reactivex.ObservableOnSubscribe;import io.reactivex.Observer;import io.reactivex.disposables.Disposable;import io.reactivex.functions.Action;import io.reactivex.functions.Consumer;public class MainActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.text); } public void click(View view) { Observable observale = getObservable();// Observer observer = getObserver();//// observale.subscribe(observer);// observale.subscribe(new Consumer() {// @Override// public void accept(String s) throws Exception {// Log.d(“MainActivity”,”accept=”+s);//// textView.append(s);// textView.append(“//n”);// }// }); observale.subscribe(new Consumer() { @Override public void accept(String s) throws Exception { if(s.equals(“奏笛”)){ Log.d(“MainActivity”,”收到奏笛?。∵@里類似于Observer的onNext()”); } if(s.equals(“吟詩”)){ Log.d(“MainActivity”,”收到吟詩??!這里類似于Observer的onNext()”); } if(s.equals(“酗酒”)){ Log.d(“MainActivity”,”收到酗酒??!這里類似于Observer的onNext()”); } textView.append(s); textView.append(“”); } }, new Consumer() { @Override public void accept(Throwable throwable) throws Exception { Log.d(“MainActivity”,”這里類似于Observer的onError()”); } }, new Action() { @Override public void run() throws Exception { Log.d(“MainActivity”,”這里類似于Observer的onComplete()”); } }); } public Observable getObservable() {// Observable observable = Observable.just(“奏笛”,”吟詩”,”酗酒”);// Observable observable = Observable.fromArray(“奏笛”,”泡吧”,”吟詩”); return Observable.fromCallable(new Callable() { @Override public String call() throws Exception { return “奏笛”; } });// return observable;// return Observable.create(new ObservableOnSubscribe() {// @Override// public void subscribe(ObservableEmitter e) throws Exception {// e.onNext(“奏笛”);// e.onNext(“吟詩”);// e.onNext(“酗酒”);// e.onComplete();//// e.onError(new);//// }// }); } public Observer getObserver(){ return new Observer() { Disposable dd =null;//定義一個變量局部變量 @Override public void onSubscribe(Disposable d) { dd = d;//把這段訂閱關系的Disposable變量拿下來 Log.d(“MainActivity”,”onSubscribe”); } @Override public void onNext(String value) { Log.d(“MainActivity”,”onNext”); if(value.equals(“酗酒”)){ dd.dispose();//如果發(fā)送的數(shù)據(jù)等于某個值,就斷絕關系 Log.d(“MainActivity”,”你的小可愛已經(jīng)不想理你了?。?!”); } } @Override public void onError(Throwable e) { Log.d(“MainActivity”,”onError”); } @Override public void onComplete() { Log.d(“MainActivity”,”onComplete”); } }; }}

    小結

    以上是我在項目中使用Rxjava的一些介紹和使用心得。以及由此引出的引入三方庫之后,我們應該如何使用和學習的一些粗淺看法。Android架構師的學習進階路線及資料,需要可以私信我發(fā)送“核心筆記”或“手冊”即可獲取!

    一句話,就是在引入一個庫后,能夠學習它背后的原理。

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權歸原作者所有,如有侵權請聯(lián)系管理員(admin#wlmqw.com)刪除。
    上一篇 2022年7月6日 15:28
    下一篇 2022年7月6日 15:29

    相關推薦

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時間:周一至周五,10:30-18:30,節(jié)假日休息