OkHttp+ Retrofit使用從0開始(一)
阿新 • • 發佈:2019-01-23
幾種網路框架的比較
1、volley
一個簡單的http非同步請求庫,但不支援同步,不能post大資料(上傳檔案時有問題);
2、android-async-http
和volley一樣,是非同步的請求庫,只不過volley使用的是httpUrlConnection,而它使用的是HttpClient。這個庫已經不再適合Android;
3、okhttp
基於httpUrlConnection,支援同步和非同步,但需要自己再封裝下;
4、retrofit;
對 okhttp再次封裝,在專案中可以直接使用。這裡主要介紹使用okhttp+retrofit
呼叫的步驟
1、引入Git上的專案
compile ‘com.squareup.retrofit2:retrofit:2.0.2’(需要在GitHub上定位到最新的版本),Rebuild專案。2、在專案中引用retrofit,分為幾個部分
- module物件 - Converter的實現類 - Service類(定義網址中不固定的部分) - OkHttpClient和Retrofit
module物件(Bean)
public class ScreenBean {
public final String mTitle;
public final String mSize;
public ScreenBean(String title,String size){
mTitle = title;
mSize = size;
}
}
ScreenConvert
public class ScreenConvert implements Converter<ResponseBody,ScreenBean>{
static final ScreenConvert.Factory FACTOYR = new ScreenConvert.Factory(){
@Override
public Converter<ResponseBody, ?> responseBodyConverter(
Type type, Annotation[] annotations, Retrofit retrofit) {
if(type == ScreenBean.class)return new ScreenConvert();
else return null;
}
};
@Override
public ScreenBean convert(ResponseBody value) throws IOException {
//values.string 把伺服器上請求的資料,轉換成string格式
return ...;
}
}
PageService
public interface PageService{
@GET("GetHotDownload.xml")
Call<ScreenBean> get(@Query("pageNum") String pageNum1,
@Query("packNumForOnePage") String packNumForOnePage,
@Query("userId") String userId,@Query("codeVersion") String version,
@Query("classId") String classId);
}
載入部分
Dispatcher dispatcher = new Dispatcher(Executors.newFixedThreadPool(20));//執行緒池
dispatcher.setMaxRequests(20);//最大的請求數量
dispatcher.setMaxRequestsPerHost(1);//主機同一個時間,最大的請求數量
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.dispatcher(dispatcher)
.connectionPool(new ConnectionPool(100,30, TimeUnit.SECONDS))
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(mUrl)
.addConverterFactory(ScreenConvert.FACTOYR)
.client(okHttpClient)
.build();
PageService pageService = retrofit.create(PageService.class);
pageService.get("1","12","0","14","0").enqueue(new Callback<ScreenBean>() {
@Override
public void onResponse(Call<ScreenBean> call, Response<ScreenBean> response) {
if(response.isSuccessful()){
Log.i(TAG, "onResponse: 成功");
}else{
Log.i(TAG, "onResponse: 失敗");
}
}
@Override
public void onFailure(Call<ScreenBean> call, Throwable t) {
Log.i(TAG, "onFailure: 失敗"+t.toString());
}
});
注意:把上面的網址替換掉,換成自己的網址
到這一步,已經可以實現基於Retrofit+OkHttp,實現和網路資料的互動。但在實際的運用中,還會設計更加複雜的情況,比如Cookie的快取,新增頭部等,下一個章節再具體談論。