廢話不多說,直接貼上代碼,代碼中完全的註釋,完整的demo在最下面
package com.example.administrator.myapplication000.http;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.concurrent.TimeUnit;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Callback;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by l on 2016-10-15.
*/
public class Retrofit2Manger {
static Retrofit2Manger retrofit2Manger;
private Retrofit2Manger() {
}
public static synchronized Retrofit2Manger getInstance() {
if (retrofit2Manger == null) {
retrofit2Manger = new Retrofit2Manger();
}
return retrofit2Manger;
}
//將retrofit的配置好,並且反射出對象以便實用
public <T> T create(Class<T> service) {
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//兼容rxjava,網絡請求可以直接返回一個Obervable或者call
.addConverterFactory(GsonConverterFactory.create())//兼容gson,網絡請求成功,直接返回一個轉換好的對象出來
.client(getOkHttpClient())//配置ohhttp
.baseUrl(getBaseUrl(service))//獲取url
.build();
return retrofit.create(service);
}
private final int Time_Out = 10;
private OkHttpClient getOkHttpClient() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(Time_Out, TimeUnit.SECONDS);
builder.readTimeout(Time_Out, TimeUnit.SECONDS);
builder.writeTimeout(Time_Out, TimeUnit.SECONDS);
//配置打印信息,網絡響應體中的數據都會打印出來
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(loggingInterceptor);
builder.addInterceptor(new HttpInterceptor());
return builder.build();
}
//所有的頭部信息都可以在這裏添加到頭部中去
public class HttpInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
Request requst = builder.addHeader("Content-type", "application/json").build();
//所有公用頭部信息,都要從這裏add進去
return chain.proceed(requst);
}
}
//簡單的反射,將url反射出來
private <T> String getBaseUrl(Class<T> service) {
try {
Field base_url = service.getField("Base_Url");
return (String) base_url.get(service);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}