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