retrofit2是一款封装okhttp的优秀的网络请求框架,搭配rxjava时有出人意料的效果,每当出去面试的时候,被问及的频率也是极高的,于是新项目里也就顺理成章的接入了retrofit2+rxjava,并做了简易的封装,趁着今天周六,写一篇文章来记录一下。
1.retrofit 网络请求
github:https://github.com/square/retrofit
我们先来使用retrofit进行一个简单的网络请求,获取必应搜索的每日一图,这是一个简单的get请求,返回数据为一个json对象,每日一图的地址需要从对象里来获取。
api:https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN
1.1先定义一个接口:
public interface NetService {
@GET("HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN")
Call<FirstImageBean> getImage();
}
baseUrl截取为 https://cn.bing.com/ 作为一个常量,放在常量类中。FirstImageBean为返回的json对应的实体类,可使用gsonformat直接生成,不做赘述。
1.2.在activity中进行请求
public void getImage() {
// 1.获取retrofit对象
Retrofit build = new Retrofit.Builder()
.baseUrl(UrlConstant.URL_BING1)
.addConverterFactory(GsonConverterFactory.create())//指定json解析
.build();
// 获取接口类对象
NetService netService = build.create(NetService.class);
netService.getImage().enqueue(new Callback<FirstImageBean>() {
@Override
public void onResponse(Call<FirstImageBean> call, retrofit2.Response<FirstImageBean> response) {
String url = response.body().getImages().get(0).getUrl();
}
@Override
public void onFailure(Call<FirstImageBean> call, Throwable t) {
LogUtil.i("请求失败:" + t.getMessage());
}
});
}
2加入rxjava再来一次网络请求
2.1重新定义接口,这次我们返回的是个Obervable对象
@GET("HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN")
Observable<FirstImageBean> getBingDayImage();
2.2.在Activty中进行请求
/**
* 获取必应搜索每日图片
*/
private void getBingImage() {
OkHttpClient build = new OkHttpClient.Builder().build();
Retrofit retrofit = new Retrofit.Builder()
.client(build)
.baseUrl(UrlConstant.URL_BING1)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
NetService netService = retrofit.create(NetService.class);
//获取每日一图
netService.getBingDayImage()
.subscribeOn(Schedulers.io())//