上一篇博客寫的是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 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