您的位置:首页 > 其它

Retrofit2.0的简单使用

2017-11-20 10:37 246 查看
上一篇博客写的是okhttp,接下来打算记录Retrofit2.0的学习,如有不足之处,还望指点一二。

在build.gradle中添加依赖:

compile "com.squareup.retrofit2:retrofit:2.1.0"
compile "com.squareup.retrofit2:converter-gson:2.1.0"
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'


这里用的实例是一个get请求的接口,baseUrl传的是主机地址+端口号,interface里面传的是后缀。

public interface Service {
//GET请求
/**
* 当URL问号后面的参数存在时,就@Query传递参数,
* 比如https://www.baidu.com/s?wd=android,就传getData(@Query("wd") String wd);
*/
@GET("api/recommendations")
//Call<ResponseBody> getData(@Query("参数名")String"自己定义的变量");
Call<ResponseBody> getData();

//Retrofit注解之HTPP请求法
//        @HTTP(method = "GET", path = "api/recommendations", hasBody = false)
//        Call<ResponseBody> getData();
}

private void Test() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://baiting.longruncloud.com/")
.build();
//无法直接调用Service接口里面的方法,我们需要自己创建代理对象service来调用
Service service = retrofit.create(Service.class);
Call<ResponseBody> call = service.getData();
// 用法和OkHttp的call一致,只是我们不需要自己再写子线程到主线程的回调,具体原因上一篇博客有讲到
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(
Call<ResponseBody> call, Response<ResponseBody> response) {
try {
Log.e("response", response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
}
});
}


默认情况下Retrofit只支持将HTTP的响应体转换为ResponseBody,而Converter可以将Response转换为我们想要的类型,即是把<Response>替换成实体类。

依赖: compile "com.squareup.retrofit2:converter-gson:2.1.0",前面已添加过,其中包里面已经写好了Gson解析,具体实现如下:

public interface Service {
//GET请求
@GET("api/recommendations")
Call<RecommendationBean> getData();
}

private void Test() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://baiting.longruncloud.com/")
.addConverterFactory(GsonConverterFactory.create())//为retrofit添加Gson支持
.build();
Service service = retrofit.create(Service.class);
Call<RecommendationBean> call = service.getData();
call.enqueue(new Callback<RecommendationBean>() {
@Override
public void
4000
onResponse(Call<RecommendationBean> call, Response<RecommendationBean> response) {
RecommendationBean body = response.body();
Log.e("body", body.getCarousels().get(0).getImage());//打印出来是以图片地址

}

@Override
public void onFailure(Call<RecommendationBean> call, Throwable t) {
t.printStackTrace();
}
});
}


RecommendationBean是打开url得到的实体类,到这里就是okhttp+retrofit的初步使用。而常与之一起使用的是Rxjava,Rxjava是一个响应式框架,采用观察者设计模式,很方便的实现了异步,这里以Rxjava为例,用Observer代替Call。

引入依赖:compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0',以上代码改写为:

public interface Service {
//GET请求
@GET("api/recommendations")
Observable<RecommendationBean> getData();
}

private void Test() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://baiting.longruncloud.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//RxJavaCallAdapterFactory为Retrofit添加RxJava支持
.build();
//无法直接调用Service接口里面的方法,我们需要自己创建代理对象service来调用
Service service = retrofit.create(Service.class);
service.getData().subscribeOn(Schedulers.io()).subscribe(new Subscriber<RecommendationBean>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}

@Override
public void onError(Throwable e) {
System.err.println("onError");
}

@Override
public void onNext(RecommendationBean recommendationBean) {
System.out.println(recommendationBean);
Log.e("carouselsBean", recommendationBean.getCarousels().get(0).getImage());
}
});
}

把学习所得记下来,和大家共勉p( ^ O ^ )q




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: