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

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

    Android架構(gòu)師RX響應(yīng)式編程-Rxjava實(shí)戰(zhàn)項(xiàng)目教學(xué)

    Android架構(gòu)師RX響應(yīng)式編程-Rxjava實(shí)戰(zhàn)項(xiàng)目教學(xué)

    RX定義

    • Rx是一個(gè)函數(shù)庫(kù),讓開(kāi)發(fā)者可以利用可觀察序列和LINQ風(fēng)格查詢操作符來(lái)編寫(xiě)異步和基于事件程序
    • Rx是微軟.NET的一個(gè)響應(yīng)式擴(kuò)展。Rx借助可觀測(cè)的序列提供一種簡(jiǎn)單的方式來(lái)創(chuàng)建異步的,基于事件驅(qū)動(dòng)的程序。
    • Rx就是一種響應(yīng)式編程,來(lái)創(chuàng)建基于事件的異步程序

    RXJava簡(jiǎn)介

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

    官方定義:一個(gè)在 Java VM 上使用可觀測(cè)的序列來(lái)組成異步的、基于事件的程序的庫(kù)

    RXJava原理

    • RxJava: 基于 一種擴(kuò)展的觀察者模式
    • RxJava的擴(kuò)展觀察者模式中有4個(gè)角色:

    簡(jiǎn)單使用方法

    代碼示例

    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); } });

    解釋說(shuō)明:

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

    實(shí)戰(zhàn)項(xiàng)目解析

    添加依賴

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

    基理

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


    基本使用三個(gè)步驟

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

    下面開(kāi)始實(shí)戰(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: 第一步,通過(guò)create()創(chuàng)建Observable(模擬對(duì)象:程序員), 通過(guò)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(模擬對(duì)象:程序員女朋友), 創(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, 實(shí)現(xiàn)訂閱:

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

    以上便完成了一個(gè)最基本的使用; 運(yùn)行效果:

    點(diǎn)擊按鈕后打印日志:

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

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

    接下來(lái)關(guān)注一下Observer構(gòu)造方法中的onSubscribe()方法;

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

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

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

    更改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(); } }); }

    運(yùn)行示例,點(diǎn)擊按鈕:

    可以發(fā)現(xiàn)已經(jīng)沒(méi)有onComplete()方法的打印信息了, 因?yàn)樵趏nNext()中途已經(jīng)斷絕訂閱關(guān)系了;

    另外還有省略observer的簡(jiǎn)潔寫(xiě)法

    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(“吟詩(shī)”)){ Log.d(“MainActivity”,”收到吟詩(shī)!!這里類似于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(“吟詩(shī)”); e.onNext(“酗酒”); e.onComplete(); } }); }

    運(yùn)行示例,點(diǎn)擊按鈕:

    更改上面代碼,

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

    效果也是一樣的; 運(yùn)行示例,點(diǎn)擊按鈕,打印日志同上:

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

    或者顯示在TextView上:

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

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

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

    特點(diǎn):只能返回一個(gè)數(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(“吟詩(shī)”)){ Log.d(“MainActivity”,”收到吟詩(shī)!!這里類似于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(“奏笛”,”吟詩(shī)”,”酗酒”);// Observable observable = Observable.fromArray(“奏笛”,”泡吧”,”吟詩(shī)”); 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(“吟詩(shī)”);// e.onNext(“酗酒”);// e.onComplete();//// e.onError(new);//// }// }); } public Observer getObserver(){ return new Observer() { Disposable dd =null;//定義一個(gè)變量局部變量 @Override public void onSubscribe(Disposable d) { dd = d;//把這段訂閱關(guān)系的Disposable變量拿下來(lái) Log.d(“MainActivity”,”onSubscribe”); } @Override public void onNext(String value) { Log.d(“MainActivity”,”onNext”); if(value.equals(“酗酒”)){ dd.dispose();//如果發(fā)送的數(shù)據(jù)等于某個(gè)值,就斷絕關(guān)系 Log.d(“MainActivity”,”你的小可愛(ài)已經(jīng)不想理你了?。?!”); } } @Override public void onError(Throwable e) { Log.d(“MainActivity”,”onError”); } @Override public void onComplete() { Log.d(“MainActivity”,”onComplete”); } }; }}

    小結(jié)

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

    一句話,就是在引入一個(gè)庫(kù)后,能夠?qū)W習(xí)它背后的原理。

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

    相關(guān)推薦

    • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應(yīng)該怎么發(fā))

      對(duì)于微商朋友來(lái)說(shuō),朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經(jīng)營(yíng)一個(gè)朋友圈,有的微商看起來(lái)逼格滿滿,實(shí)際效果也不錯(cuò);而有的卻動(dòng)都不動(dòng)就被屏蔽甚至拉黑…

      2022年11月27日
    • 30個(gè)無(wú)加盟費(fèi)的項(xiàng)目(茶顏悅色奶茶店加盟費(fèi)多少)

      茶顏悅色又爆了,8月18日,茶顏悅色南京門店正式開(kāi)業(yè),開(kāi)張不到半小時(shí),門店就人滿為患,消費(fèi)者的購(gòu)買熱情十分高漲,而由于人流量過(guò)大造成擁堵,茶顏悅色也不得不暫停營(yíng)業(yè)。 當(dāng)然,這里面排…

      2022年11月27日
    • 凈利潤(rùn)率越高越好嗎(凈利潤(rùn)率多少合適)

      一、持續(xù)增收不增利,平均凈利潤(rùn)率首次跌入個(gè)位數(shù) 2021年,增收不增利依舊是行業(yè)主流。具體來(lái)看,大部分企業(yè)營(yíng)業(yè)收入呈增長(zhǎng)態(tài)勢(shì),E50企業(yè)平均同比增速達(dá)到17.3%,但是利潤(rùn)增速則明…

      2022年11月26日
    • 《寶可夢(mèng)朱紫》夢(mèng)特性怎么獲得?隱藏特性獲取方法推薦

      寶可夢(mèng)朱紫里有很多寶可夢(mèng)都是擁有夢(mèng)特性會(huì)變強(qiáng)的寶可夢(mèng),很多玩家不知道夢(mèng)特性怎么獲得,下面就給大家?guī)?lái)寶可夢(mèng)朱紫隱藏特性獲取方法推薦,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 …

      2022年11月25日
    • 《寶可夢(mèng)朱紫》奇魯莉安怎么進(jìn)化?奇魯莉安進(jìn)化方法分享

      寶可夢(mèng)朱紫中的奇魯莉安要怎么進(jìn)化呢?很多玩家都不知道,下面就給大家?guī)?lái)寶可夢(mèng)朱紫奇魯莉安進(jìn)化方法分享,感興趣的小伙伴一起來(lái)看看吧,希望能幫助到大家。 奇魯莉安進(jìn)化方法分享 奇魯莉安…

      2022年11月25日
    • 規(guī)范透明促PPP高質(zhì)量發(fā)展——16萬(wàn)億元大市場(chǎng)迎來(lái)新規(guī)

      近日,財(cái)政部印發(fā)《關(guān)于進(jìn)一步推動(dòng)政府和社會(huì)資本合作(PPP)規(guī)范發(fā)展、陽(yáng)光運(yùn)行的通知》,從做好項(xiàng)目前期論證、推動(dòng)項(xiàng)目規(guī)范運(yùn)作、嚴(yán)防隱性債務(wù)風(fēng)險(xiǎn)、保障項(xiàng)目陽(yáng)光運(yùn)行四個(gè)方面進(jìn)一步規(guī)范P…

      2022年11月25日
    • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

      CPA渠道 CPA指的是按照指定的行為結(jié)算,可以是搜索,可以是注冊(cè),可以是激活,可以是搜索下載激活,可以是綁卡,實(shí)名認(rèn)證,可以是付費(fèi),可以是瀏覽等等。甲乙雙方可以根據(jù)自己的情況來(lái)定…

      2022年11月25日
    • 推薦3種白手起家的賺錢項(xiàng)目(白手起家賺錢項(xiàng)目有哪些)

      如今社會(huì)壓力非常的大,家有老少要養(yǎng)活,這些都加速了窮人想要?jiǎng)?chuàng)業(yè)的欲望,但是創(chuàng)業(yè)路總是那么的艱難,資金就是創(chuàng)業(yè)的重頭戲,所以選擇一個(gè)低成本又賺錢的項(xiàng)目是大多數(shù)人最期望的了,那么有哪些…

      2022年11月25日
    • 抖音直播帶貨有哪些方法技巧(抖音直播帶貨有哪些痛點(diǎn))

      如今抖音這個(gè)短視頻的變現(xiàn)能力越來(lái)越突顯了,尤其是在平臺(tái)上開(kāi)通直播,更具有超強(qiáng)的帶貨屬性,已經(jīng)有越來(lái)越多的普通人加入到其中了。不過(guò)直播帶貨雖然很火,但是也不是每個(gè)人都能做好的,那么在…

      2022年11月24日
    • 事件營(yíng)銷案例

      篇一成功營(yíng)銷案例小故事成功銷售案例小故事篇1模仿 一個(gè)人想做一套家具,就走到樹(shù)林里砍倒一棵樹(shù),并動(dòng)手把它鋸成木板這個(gè)人鋸樹(shù)的時(shí)候,把樹(shù)干的一頭擱在樹(shù)墩上,自己騎在樹(shù)干上還往鋸開(kāi)的縫…

      2022年11月24日

    聯(lián)系我們

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