rxjava2要点介绍

版权声明: https://blog.csdn.net/henysugar/article/details/83501938

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

本文未完待续。

猜你喜欢

转载自blog.csdn.net/henysugar/article/details/83501938