RxJava与Retrofit的基本使用和结合使用

  • Post author:
  • Post category:java


RxJava是什么?

Rx全称为ReactiveX,它一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流。它基于设计模式中的观察者模式,通过以下的方式简化代码:

  • 函数式风格:对可观察数据流使用无副作用的输入输出函数,避免了程序里错综复杂的状态
  • 简化代码:Rx的操作符通通常可以将复杂的难题简化为很少的几行代码
  • 异步错误处理:传统的try/catch没办法处理异步计算,Rx提供了合适的错误处理机制
  • 轻松使用并发:Rx的Observables和Schedulers让开发者可以摆脱底层的线程同步和各种并发问题

RxJava基本使用:

第一步:创建一个Observable(被观察者)

        Observable observable=Observable.create(new ObservableOnSubscribe<String>() {
            public void subscribe(ObservableEmitter<String> observableEmitter) throws Exception {
                observableEmitter.onNext("onNext");

            }
        });

第二步:创建一个Observer(观察者)

       Observer<String> observer=new Observer<String>() {
            public void onSubscribe(Disposable disposable) {

            }

            public void onNext(String s) {
                System.out.println(s);
            }

            public void onError(Throwable throwable) {

            }

            public void onComplete() {

            }
        };

第三步:建立订阅关系

        observable.subscribe(observer);

当然也可以使用链式格式

        Observable.create(new ObservableOnSubscribe<String>() {
            public void subscribe(ObservableEmitter<String> observableEmitter) throws Exception {
                observableEmitter.onNext("onNext");
            }
        }).subscribe(new Observer<String>() {
            public void onSubscribe(Disposable disposable) {
            }

            public void onNext(String s) {
                System.out.println("onNext:"+s);
            }

            public void onError(Throwable throwable) {
            }

            public void onComplete() {
            }
        });

Retrofit是什么?

Retrofit是一款基于OkHttp的的网络请求框架,它对OkHttp做了大量封装,将网络请求的细节交给OkHttp,开发者只需进行少量配置便可以轻松进行网络请求。

Retrofit的使用:

第一步:创建一个请求的接口

public interface PeopleService {
    @GET("mPath")
    Call<PeopleEntiy> getPeople(@Query("name") String name);
}

第二步:创建一个实例

String url="...";    //请求接口url
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(url)
    .addConverterFactory(GsonConverterFactory.create())
    .build();
PeopleService service = retrofit.create(PeopleService.class);

第三步:获取一个call实例

Call<PeopleEntity> call = service.getPeople("小明");

第四步:同步或者异步请求

1.同步请求(需要阻塞)

PeopleEntity response = call.execute().body();

2.异步请求

call.enqueue(new Callback<PeopleEntity>() {
  @Override
  public void onResponse(Call<PeopleEntity> call,Response<PeopleEntity> response) {
   
  }
  @Override
  public void onFailure(Call<PeopleEntity> call, Throwable t) {

  }
});

RxJava与Retrofit的结合使用

由于要使用Rxjava,所以要将数据的处理权交给Observer(被观察者)而不是Call,那么就要把返回的Call改为Observable。

public interface PeopleService {
    @GET("mPath")
    Observable<PeopleEntiy> getPeople(@Query("name") String name);
}

添加RxJava的支持

String url="...";    //请求接口url
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(url)
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  // 添加RxJava的支持
    .build();
PeopleService service = retrofit.create(PeopleService.class);

获取Observable实例

Observable<PeopleEntity> observable= service.getPeople("小明");

建立订阅关系

        observable.subscribeOn(Schedulers.io()) // 异步处理http请求
        .observeOn(AndroidSchedulers.mainThread()) // 在UI线程处理结果
        .subscribe(new Observer<PeopleEnity>() { // 订阅
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(PeopleEnity peopleEnity) {
                
            }
        });

两者结合起来,虽然在代码层面看起来似乎是复杂了,但是简化了处理的逻辑,使代码变得更加清晰有条理。


在Android的业务层与显示层分离上,这种结合使用的方式也有很大优势:

可以将Observer的创建放在显示层上,对信息进行显示处理,而将Observer对象传给业务层进行业务处理。

业务层变为:

        observable.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(observer);  //显示层传过来的observer对象

显示层处理显示逻辑:

        Observer observer=new Observer<PeopleEnity>() { 
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onCompleted() {
    
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(PeopleEnity peopleEnity) {
                textview.setText(peopleEnity.getName())
            }
        };



版权声明:本文为qq_36598186原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。