RxJava2

1,108 阅读1分钟

RxJava 设计的四个概念:

  • 观察者: 对事件进行响应的对象,也可以称作消费者,在上述的代码中,subscirbe方法的参数是一个Consumer对象,该对象后续会被包装成一个LambdaObserver对象,即为这段代码中的观察者(消费者)。
  • 被观察者: 产生事件的对象,也可以称作生产者,在上述代码中,Observable.fromArray(...)返回的是一个Observable对象,即为这段程序的被观察者(生产者)。
  • 事件:RxJava中存在四种事件流:onSubscribe(订阅事件),onNext(正常事件),onError(异常事件),onComplete(完成事件)。在上述代码中,是将数组中的元素作为onNext事件中的数据进行发送。
  • 订阅: 创建观察者与被观察者之间观察关系,对应着上述代码中的subscribe()方法。RxJava的事件驱动模型是一种“拉模型”,在观察者没有进行事件订阅之前是不会有事件产生的,只有观察者进行订阅后,才会触发被观察者生产事件。

1.RxJava步骤:

添加依赖:

implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation'io.reactivex.rxjava2:rxjava:2.2.4'
implementation'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'

2.添加一个登录Service:

public interface RxService {

        @FormUrlEncoded  //表单方式传递键值对
        @POST("user/login")
        Observable<UserInfo> login(
                @Field("username") String username,
                @Field("password") String password
        );
    }

3.创建RxJava配置:

 
mRetrofit = new Retrofit.Builder()
        .client(builder.build())
        .addConverterFactory(GsonConverterFactory.create())//使用Gson解析
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())  //适配RxJava2.0, RxJava1.x则为RxJavaCallAdapterFactory.create()

4.RxJava进行封装请求:


public Observable<UserInfo> login(String username, String password) {
    return rxService.login(username, password)
        .subscribeOn(Schedulers.io())
        .unsubscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread());
        
        
  RetrofitManager.getManager().login("username", "password")
                .subscribe(new Consumer<UserInfo>() {
                    @Override
                    public void accept(UserInfo userInfo) throws Exception {
                        Log.e("TAG", "请求成功" + userInfo);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.e("TAG", "请求失败" + throwable.getMessage());
                    }
                });
    }
}