小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

andorid jar/庫(kù)源碼解析之RxJava2

 小樣樣樣樣樣樣 2021-12-25

目錄:andorid jar/庫(kù)源碼解析 

RxJava2:

  作用:

    通過(guò)提供一種,觀察者和訂閱者的模式,的架構(gòu),來(lái)優(yōu)化邏輯流程。適用于復(fù)雜和需要多數(shù)據(jù)轉(zhuǎn)換和長(zhǎng)流程。

  栗子:

   定義三個(gè)對(duì)象類

public class ResultInfo {
    public int code;
    public String msg;
    public String data;
}

public class UserInfo {
    public int status;
    public String name;
    public String head;
    public List<SkillInfo> skillInfoList;
}

public class SkillInfo {
    public String name;
    public int level;

    public SkillInfo(String name, int level){
        this.name = name;
        this.level = level;
    }
}

  一段邏輯測(cè)試代碼:

    private ResultInfo login_http(String name, String pwd){
        ResultInfo resultInfo = new ResultInfo();
        resultInfo.code = 0;
        resultInfo.msg = "";

        Gson gson = new Gson();
        UserInfo userInfo = new UserInfo();
        userInfo.status = 1;
        userInfo.name = "";
        userInfo.head = "";
        userInfo.skillInfoList = new ArrayList<>();
        userInfo.skillInfoList.add(new SkillInfo("音樂(lè)", 10));
        userInfo.skillInfoList.add(new SkillInfo("美術(shù)", 6));
        userInfo.skillInfoList.add(new SkillInfo("體育", 9));
        resultInfo.data = gson.toJson(userInfo);

        return resultInfo;
    }

  版本1:(定義一個(gè)被觀察的對(duì)象,和訂閱者,設(shè)置他們使用的線程,最后通過(guò)調(diào)用 subscribe,使他們關(guān)聯(lián)起來(lái)。且執(zhí)行)

Observable<ResultInfo> observable = Observable.create(new ObservableOnSubscribe<ResultInfo>() {
            @Override
            public void subscribe(ObservableEmitter<ResultInfo> e) throws Exception {
                e.onNext(login_http(name, pwd));
            }
        });

        Consumer<ResultInfo> consumer = new Consumer<ResultInfo>() {
            @Override
            public void accept(ResultInfo resultInfo) throws Exception {
                if(resultInfo.code == 0){
                    Gson gson = new Gson();
                    UserInfo userInfo = gson.fromJson(resultInfo.data, UserInfo.class);
                    if(userInfo.status == 0){
                        // 注冊(cè)
                        Toast.makeText(getBaseContext(), "注冊(cè)", Toast.LENGTH_LONG).show();
                    } else if(userInfo.status == 1){
                        // 登錄
                        Toast.makeText(getBaseContext(), "登錄", Toast.LENGTH_LONG).show();
                    }
                }
            }
        };

        // subscribeOn() 指定的是發(fā)送事件的線程, observeOn() 指定的是接收事件的線程.
        observable.subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(consumer);

  版本2:(在版本1的基礎(chǔ)上,通過(guò)在被觀察者調(diào)用map處理,觀察的數(shù)據(jù),使數(shù)據(jù)只返回結(jié)果,而訂閱者也是對(duì)結(jié)果進(jìn)行判斷,這里使用的數(shù)據(jù)類型發(fā)生了改變)。

Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<ResultInfo>() {
            @Override
            public void subscribe(ObservableEmitter<ResultInfo> e) throws Exception {
                e.onNext(login_http(name, pwd));
            }
        }).map(new Function<ResultInfo, Integer>() {
            @Override
            public Integer apply(ResultInfo resultInfo) throws Exception {
                return resultInfo.code;
            }
        });

        Consumer<Integer> consumer = new Consumer<Integer>() {
            @Override
            public void accept(Integer code) throws Exception {
                if(code == 0){
                    Toast.makeText(getBaseContext(), "成功", Toast.LENGTH_LONG).show();
                } else{
                    Toast.makeText(getBaseContext(), "失敗", Toast.LENGTH_LONG).show();
                }
            }
        };

        // subscribeOn() 指定的是發(fā)送事件的線程, observeOn() 指定的是接收事件的線程.
        observable.subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(consumer);

  版本3:(使用RxJava的優(yōu)勢(shì),鏈?zhǔn)秸{(diào)用,來(lái)完成邏輯)

Observable.create(new ObservableOnSubscribe<ResultInfo>() {
            @Override
            public void subscribe(ObservableEmitter<ResultInfo> e) throws Exception {
                e.onNext(login_http(name, pwd));
            }
        }).map(new Function<ResultInfo, Integer>() {
            @Override
            public Integer apply(ResultInfo resultInfo) throws Exception {
                return resultInfo.code;
            }
        }).subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer code) throws Exception {
                        if(code == 0){
                            Toast.makeText(getBaseContext(), "成功", Toast.LENGTH_LONG).show();
                        } else{
                            Toast.makeText(getBaseContext(), "失敗", Toast.LENGTH_LONG).show();
                        }
                    }
                });

  版本4:(同時(shí)引入了flatMap來(lái),處理集合數(shù)據(jù),返回集合,每個(gè)數(shù)據(jù)都可以響應(yīng)訂閱者的accept方法,同時(shí)引入了filter對(duì)數(shù)據(jù)進(jìn)行過(guò)濾,類似于C#中的,linq用法。)

Observable.create(new ObservableOnSubscribe<ResultInfo>() {
            @Override
            public void subscribe(ObservableEmitter<ResultInfo> e) throws Exception {
                e.onNext(login_http(name, pwd));
            }
        }).map(new Function<ResultInfo, UserInfo>() {
            @Override
            public UserInfo apply(ResultInfo resultInfo) throws Exception {
                UserInfo userInfo = new Gson().fromJson(resultInfo.data, UserInfo.class);

                return userInfo;
            }
        }).flatMap(new Function<UserInfo, Observable<SkillInfo>>() {
            @Override
            public Observable<SkillInfo> apply(UserInfo userInfo) throws Exception {
                return Observable.fromArray(userInfo.skillInfoList.toArray(new SkillInfo[userInfo.skillInfoList.size()]));
            }
        }).filter(new Predicate<SkillInfo>() {
            @Override
            public boolean test(SkillInfo skillInfo) throws Exception {
                return skillInfo.level > 8;
            }
        })
        .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<SkillInfo>() {
                    @Override
                    public void accept(SkillInfo skillInfo) throws Exception {
                        Toast.makeText(getBaseContext(), skillInfo.name + " " + skillInfo.level, Toast.LENGTH_SHORT).show();
                    }
                });

        // 類似于linq , take, skip deng

  版本5:當(dāng)然,RxJava的用法不僅僅這些,還有沒(méi)有提到的,take,取幾個(gè)成員,skip,跳過(guò)幾個(gè)成員。等,這些用法和C#中的linq類似,詳細(xì)很好理解

  // 代碼,略

  源碼解讀:

  // 源碼解讀,后面再補(bǔ)上。

  源碼:https://github.com/ReactiveX/RxJava

  引入:

implementation "io.reactivex.rxjava2:rxjava:2.0.7"
implementation "io.reactivex.rxjava2:rxandroid:2.0.1"

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多