Android Retrofit Client的简单封装
前言
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。
使用
添加build.grade依赖
dependencies {
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
}
定义接口
public interface NetService {
@POST("getNewestVersion")
io.reactivex.Observable<ResponseBody> getAppVersion(
);
}
OkHttpUtil
public class OkHttpUtil {
private static final long CACHE_MAX_AGE = 60 * 1;
private static final long CACHE_STALE_SEC = 60 * 60 * 24;
private static final String CACHE_CONTROL_CACHE = "only-if-cached, max-stale=" + CACHE_STALE_SEC;
private static final String CACHE_CONTROL_AGE = "max-age="+CACHE_MAX_AGE;
public static OkHttpUtil getInstance(){
return new OkHttpUtil();
}
public OkHttpClient getOkHttpClient(){
Cache cache = new Cache(new File(TtPhoneApplication.getInstance().getCacheDir().getAbsolutePath(),"HttpCache"),1024 * 1024 * 10);
return new OkHttpClient.Builder()
.cache(cache)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.addInterceptor(mLoginInterceptor)
.addNetworkInterceptor(mRewriteCacheControlInterceptor)
.addInterceptor(mRewriteCacheControlInterceptor)
.build();
}
public static boolean isNetWorkAvailable(){
ConnectivityManager connectivityManager = (ConnectivityManager) TtPhoneApplication.getInstance()
.getSystemService(Context.CONNECTIVITY_SERVICE);
if(connectivityManager != null){
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.isConnected()){
if(networkInfo.getState() == NetworkInfo.State.CONNECTED){
return true;
}
}
}
return false;
}
private final Interceptor mLoginInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long start = System.nanoTime();
Log.i("AddLogInterceptor:", String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
long end = System.nanoTime();
Response response = chain.proceed(request);
return response;
}
};
private final Interceptor mRewriteCacheControlInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!isNetWorkAvailable()) {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
Response originalResponse = chain.proceed(request);
if (isNetWorkAvailable()) {
String cacheControl = request.cacheControl().toString();
return originalResponse.newBuilder()
.header("Cache-Control", cacheControl)
.removeHeader("Pragma")
.build();
} else {
return originalResponse.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + CACHE_STALE_SEC)
.removeHeader("Pragma")
.build();
}
}
};
}
RetrofitUtils
public class NetWorkUtils {
private static volatile NetWorkUtils sNetWorkUtils;
private static volatile OkHttpClient sOkHttpClient;
private Retrofit mRetrofit;
private NetWorkUtils(){
mRetrofit = new Retrofit.Builder()
.baseUrl(Constans.BASE_URL)
.client(NetWorkUtils.getOkHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
public static NetWorkUtils getInstance(){
if(sNetWorkUtils == null){
synchronized(NetWorkUtils.class){
if(sNetWorkUtils == null){
sNetWorkUtils = new NetWorkUtils();
}
}
}
return sNetWorkUtils;
}
public static OkHttpClient getOkHttpClient(){
if(sOkHttpClient == null){
synchronized (NetWorkUtils.class){
if(sOkHttpClient == null){
sOkHttpClient = OkHttpUtil.getInstance().getOkHttpClient();
}
}
}
return sOkHttpClient;
}
@SuppressWarnings("unchecked") // Single-interface proxy creation guarded by parameter safety.
public <T> T createService(final Class<T> service){
return mRetrofit.create(service);
}
}
参考使用
public void getAppversionRequest(){
NetWorkUtils.getInstance()
.createService(NetService.class)
.getAppVersion()
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody value) {
LogUtils.i("ok " + value.string());
}
@Override
public void onError(Throwable e) {
LogUtils.i("look over cause of error = " + e.getMessage());
}
@Override
public void onComplete() {
}
});
总结
Retrofit 使用的简单流程