rxjava2要點介紹

rxjava2比1有什麼差異?

如果說開發rxjava1的時候,作者只是個程序初哥,那麼rxjava2的時候,作者已經是有點經驗的人了,rxjava2的接口函數、類名的命名以及接口調用方式,都比rxjava1成熟不少,且更容易理解,邏輯也合理些。

flowable

數據/事件源增加了一個叫flowable的東西,和observable類似,都是把數據/事件推給訂閱方進行處理。

特點如其名flowable,支持流控,採用backpressure的方式。

Observable的創建

這樣:Observable.create(new ObservableOnSubscribe) 。

不再是rxjava1那種:Observable.create(new Observable.OnSubscribe);

其實上面的“OnSubscribe”,建議修改爲“callBack”可能更好理解些。

看代碼:

Observable.create(new ObservableOnSubscribe<Integer>() {
     public void subscribe(ObservableEmitter<Integer> e)
        {
            e.onNext(1);
            e.onNext(2);
            e.onNext(3); 
            e.onComplete(); 
        } 
    })

響應/處理 數據/事件

看代碼吧:

Observable dataSource = Observable.create(...);
dataSource.subscribe(new Observer<Integer>() {
        private int i; 
        private Disposable mDisposable; 
    
        public void onSubscribe(Disposable d) { mDisposable = d; } 

        public void onNext(@NonNull Integer integer) {
             i++; 
            if (i == 2)
                mDisposable.dispose(); 
        } 

        public void onError(Throwable e) { log(e.getMessage()); } 
        public void onComplete() { log("onComplete"); } 
    }
)

上面這種響應,有點複雜,可以用簡單的!

例如:Consumer ,用於接收單個值,BiConsumer 則是接收兩個值,Function 用於變換對象,Predicate 用於判斷。

subscribeOn

指定數據/事件發射動作時候的線程。多次調用,以第一次的爲準,後面的調用無效。

observeOn

指定訂閱者處理數據/事件所在的線程。可以調用多次指定在不同線程做不同的數據/事件處理。

okhttp使用rxjava例子

Observable.create(new ObservableOnSubscribe<Response>()
{
    public void subscribe(ObservableEmitter<Response> emitter) throws Exception
    {
        Request.Builder builder = new Request.Builder().url("http://api.test.com/?abc=123").get();
        Request request = builder.build();
        Call call = new OkHttpClient().newCall(request);
        Response response = call.execute();
        emitter.onNext(response);
    }
})
.map(new Function<Response, HttpAPIResultObject>()
{
    public HttpAPIResultObject apply(Response response) throws Exception
    {
        if (response.isSuccessful())
        {
            ResponseBody body = response.body();
            if (body != null)
                return new Gson().fromJson(body.string(), HttpAPIResultObject.class);
        }
        return null;
    }
})
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(new Consumer<HttpAPIResultObject>()
    {
        public void accept(HttpAPIResultObject s) throws Exception
        {
            log("可以在這裏做存儲動作" + s.toString());
        }
    }
)
.subscribeOn(Schedulers.io()) // io線程處理網絡過程
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<HttpAPIResultObject>()
    { // UI線程處理
        public void accept(HttpAPIResultObject data) throws Exception
        {
            log("ui線程處理,可以在這裏做界面相關操作" + data.toString());
        }
    }
    ,new Consumer<Throwable>()
    {
        public void accept(Throwable throwable) throws Exception
        {
            log("失敗" + throwable.getMessage());
        }
    }
);

 

 

本文未完待續。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章