1. 程式人生 > >OkHttp+ Retrofit使用從0開始(一)

OkHttp+ Retrofit使用從0開始(一)

幾種網路框架的比較

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類(定義網址中不固定的部分)
- OkHttpClientRetrofit

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的快取,新增頭部等,下一個章節再具體談論。