專案中快速搭建Retrofit

Songlcy發表於2016-08-31

本篇部落格將和大家分享如何在專案中快速搭建Retrofit。關於Retrofit的基本使用方法網上的例子很多,大家可自行參考,這裡,我也給大家分享幾個比較好的入門文章,僅供參考:

https://gold.xitu.io/entry/579f1749a633bd006009eca4
首先要引入該庫:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

今天的主題是和大家分享如何在專案中快速搭建一個Retrofit。首先我們知道,網路請求例項在App中都是以單例模式存在的。所以我們就需要建立一個網路請求工具類來封裝。

關於單例模式的寫法,相信大家都不陌生,單例模式的實現方式很多種:懶漢式,餓漢式,列舉,內部類等等。。這裡我就不一一詳細說明了。下面來看程式碼:

package com.example.song.retrofittest.model;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by Song on 2016/8/30.
 */
public class HttpUtils {

    private static Retrofit mRetrofit;
    private static volatile HttpUtils httpUtils;
    private HttpUtils() {
        mRetrofit = new Retrofit.Builder()
                .baseUrl("")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

    }

    public static HttpUtils getInstance() {
        if(httpUtils == null) {
            synchronized (HttpUtils.class) {
                if(httpUtils == null) {
                    httpUtils = new HttpUtils();
                    return httpUtils;
                }
            }
        }
        return httpUtils;
    }
從上面程式碼我們看到:

(1)私有建構函式中,我們初始化了Retrofit。

(2)公開getInstance方法用來實現單例模式。

現在Retorfit初始化完了。就可以使用該物件來操作網路請求了。我們知道,Retrofit傳送請求需要使用create方法。來看下原始碼:

public <T> T create(final Class<T> service) {
  Utils.validateServiceInterface(service);
  if (validateEagerly) {
    eagerlyValidateMethods(service);
  }
  return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
      new InvocationHandler() {
        private final Platform platform = Platform.get();

        @Override public Object invoke(Object proxy, Method method, Object... args)
            throws Throwable {
          // If the method is a method from Object then defer to normal invocation.
          if (method.getDeclaringClass() == Object.class) {
            return method.invoke(this, args);
          }
          if (platform.isDefaultMethod(method)) {
            return platform.invokeDefaultMethod(method, service, proxy, args);
          }
          ServiceMethod serviceMethod = loadServiceMethod(method);
          OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
          return serviceMethod.callAdapter.adapt(okHttpCall);
        }
      });
}
上面就是Retrofit的create方法的原始碼,大致可以看出,create方法使用了泛型來控制引數和返回引數的型別保持一致。細心的小夥伴肯定看到了Proxy.newProxyInstance()方和new InvocationHandler(){}!!沒錯,這不就是Java中的動態代理機制嗎!!!並且我們看到在invoke方法中,對method進行一些判斷並封裝成ServiceMethod方法,通過okhttpCall來傳送請求。

通過上面的分析,我們就需要公開一個create方法,下面來看程式碼:

public <T>T create(Class<T> cls) {
    return mRetrofit.create(cls);
}
可以看到,我們在create方法中,通過呼叫Retrofit例項的create方法來返回具體的請求服務例項。
這樣,一個Retrofit的網路請求封裝就完成了。在Activity中具體使用:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);
        LoadData loadData = HttpUtils.getInstance().create(LoadData.class);
        loadData.loadData("001");
    }
}
ok,到這裡對Retorfit的封裝就完成了。分分鐘搞定Retrofit的整合使用!!

相關文章