Android Rxjava-Retrofit-Okhttp三剑
参考:http://gank.io/post/560e15be2dca930e00da1083
(本文部分内容取自该文章)
介绍Rxjava
GitHub主页上的介绍:
a library for composing asynchronous and event-based programs using observable sequences for the Java VM
(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)
他是一个异步操作的库,让代码变得更加简洁
观察者模式
首先介绍一下观察者模式:
- 观察者:他始终监视着被观察者的行为,当被观察者的状态发生改变的时候会通知观察者,观察者会执行相应的操作。
- 被观察者:被观察者监视的对象,当状态发生变化的时候通知观察者
- 订阅:将观察者和被观察者联系起来
举一个栗子:Android常用的Button和他的点击事件
他们的角色如下:
- 观察者:OnClickLisener
- 被观察者:Button
- 订阅:setOnClickLisener
那么在Rxjava里我们也将角色进行一下分配:
- 观察者:Observer
- 被观察者:Observable
- 订阅:subscribe()。
1:观察者Observer:他决定被观察者在触发的时候会执行什么操作,在Rxjava里回调事件有很多个,比如onNext();(类似于OnClick事件),还有几个特殊的回调事件:
- onCompleted( ):在事件队列结束的时候调用此方法,在Rxjava里会把每一个事件都单独处理并且会把他们当作一个队列,当所有的onNext()事件都执行完毕时就会调用此方法
- onError(): 异常处理方法,当事件处理的过程中出现异常时调用此方法
注:onCompleted()和onError()是互斥的,再一个正常运行的事件队列中只会在最后调用他们其中的一个,不会同时调用
2:被观察者: observable: 它决定什么时候触发事件以及触发怎样的事件。
3:订阅subscribe(): 创建了Observable和Observer之后,再用subscribe()方法将它们联结起来
使用Rxjava
- 添加依赖
最新版可以去GitHub上找 https://github.com/ReactiveX/RxJava
implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
Observable observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onComplete();
}
});
//创建观察者observer
Obsercer observer = new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.d("chen", "subscribe");
}
@Override
public void onNext(Integer value) {
Log.d("chen", value.toString());
getBlog();
}
@Override
public void onError(Throwable e) {
Log.d("chen", "error");
}
@Override
public void onComplete() {
Log.d("chen", "complete");
}
};
observable.subscribe(observer); //订阅
这样就完成了一次Rxjava的使用
介绍Retrofit
在Android开发中网络请求是非常常见的,而在Android网络请求库中Retrofit是非常好用的一个
需要注意的是Retrofit仅复制网络请求接口的封装,而网络请求的工作本质上是由Okhttp完成的
Retrofit的使用
注解
Retrofit使用大量注解来简化请求,Retrofit将okhttp请求抽象成java接口,使用注解来配置和描述网络请求参数。
注解的使用:
1:使用Get请求:
public interface SimpleDemoApiService {
@GET("bins/1bcga4")
Call<ResponseBody>getJereChenBlog();
}
这是一个最简单的Get请求方式,需要在头部添加@GET(" ")注解,括号内填的是URl的部分地址,他的返回类型是Call<***>,***表示接受数据的实体类,如果想获取原始数据可以填写ResponseBody,ResponseBody是请求之后返回的原始数据。
注:retrofit把URL分为了两个地方配置,第一部分在实例化retrofit对象时通过.baseURL();配置,第二部分在注解中配置,两者加起来才是完整的url地址。
retrofit简单使用
添加依赖:
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
在清单文件中添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
创建接收服务器返回数据的类
public class Goods {
private String name;
private String price;
private String image;
public Goods(String name, String price, String image) {
this.name = name;
this.price = price;
this.image = image;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}
创建网络接口的类
public interface SimpleDemoApiService {
@GET("bins/1bcga4")
Call<ResponseBody>getJereChenBlog();
}
创建retrofit实例化的类
public class SimpleDemoApiWrapper {
private static Retrofit retrofit;
private static final String BASE_URL = "https://api.myjson.com/";
public static Retrofit getRetrofitInstance(){
if (retrofit == null){
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(50,TimeUnit.SECONDS)
.connectTimeout(1,TimeUnit.MINUTES)
.build();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
}
return retrofit;
}
}
具体使用
SimpleDemoApiService simpleDemoApiService = SimpleDemoApiWrapper.getRetrofitInstance().create(SimpleDemoApiService.class);
simpleDemoApiService.
getJereChenBlog()
.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
String json = response.body().string();
Log.d("chen", json);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.d(TAG, "onFailure: ");
}
});