Rxjava2.0浅析

来源:互联网 发布:can网络 编辑:程序博客网 时间:2024/05/16 06:35

Rxjava2.0是在Rxjava1的基础上进行了升级
Rxjava2.0和Rxjava1的区别
Rxjava2.0官方Javadoc文档

使用

无论是Rxjava1.0还是2.0,创建Rxjava完整流程分为三步
1.创建 Observer

 Observer<WeatherInfoEntity> observer = new Observer<WeatherInfoEntity>() {            @Override            public void onSubscribe(Disposable d) {                Log.d(TAG, "onSubscribe");            }            @Override            public void onNext(String value) {                Log.d(TAG, value.getCity());                weatherView.showWeatherData(value);            }            @Override            public void onError(Throwable e) {                e.printStackTrace();                Log.d(TAG, "error");            }            @Override            public void onComplete() {            }        };

Rxjava2.0创建的Observer中多了一个回调方法onSubscribe,传递参数为Disposable ,Disposable 相当于RxJava1.x中的Subscription,用于解除订阅。在RxJava1.x中是订阅时返回Disposable,而不是选择回调出来。官方说是为了设计成Reactive-Streams架构。假设Observer需要在接收到异常数据项时解除订阅,在RxJava2.x中则非常简便。只要在onSubscribe中获取Disposable ,然后在onNext()方法中出现异常数据时,就可以调用disposable.dispose()解除订阅了。

2.创建 Observable

Observable<WeatherInfoEntity> observable = Observable.create(new ObservableOnSubscribe<WeatherInfoEntity>() {           @Override           public void subscribe(ObservableEmitter<WeatherInfoEntity> e) throws Exception {               e.onNext("zoky");           }       });

这里跟1.0不同的是:方法的回调的是ObservableEmitter,字面意思即发射器,用于发射数据(onNext)和通知(onError/onComplete)。

3.建立订阅关系

observable.subscribe(observer);

这样就完成简单的Rxjava订阅事件流程。

跟Rxjava1一样,Rxjava2跟Retrofit2.x的结合也是听方便的,只要我们在Service中请求方法中返回一个Observable对象,就可以很方便的使用Rxjava来执行网络请求结果的回调。:

public interface WeatherService {    @Headers("Cache-Control: public, max-age=3600")    @GET("{weatherId}.json")    Observable<WeatherInfoEntity> getWeatherInfo(@Path("weatherId") String weatherId );}
public void getWeatherResult(String areaId) {        if (areaId == null) {            Log.d(TAG, "aread is null");        } okHttpClient = builder.build();        Retrofit retrofit = new Retrofit.Builder().client(okHttpClient).baseUrl(BASE_URL)                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())                .addConverterFactory(GsonConverterFactory.create()).build();        service = retrofit.create(WeatherService.class);        service.getWeatherInfo(areaId)                .subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(new Observer<WeatherInfoEntity>() {                    @Override                    public void onSubscribe(Disposable d) {                        Log.d(TAG, "onSubscribe");                    }                    @Override                    public void onNext(WeatherInfoEntity value) {                        Log.d(TAG, value.getCity());                        weatherView.showWeatherData(value);                    }                    @Override                    public void onError(Throwable e) {                        e.printStackTrace();                        Log.d(TAG, "error");                    }                    @Override                    public void onComplete() {                    }                });    }

关于操作符,Schedule线程切换原理等,RxJava1.x与RxJava2.x在命名和行为上大多数保持了一致,
这里推荐看抛物线前辈的: 给Android开发者的Rxjava指南
中的操作符部分,我目前能力有限,就不在这里赘述了。虽然现在已经更新到Rxjava2.0了,但这篇文章应该是学习Rxjava的入门经典了。推荐一看~~

0 0
原创粉丝点击