title: RetrofitUtils的工具類
date: 2016-10-31 10:33:27
tags: Utils
-
直接上代碼 ,一個(gè)RetrofitFactory单旁,一個(gè)ApiFactory
package com.aidebar.retrofitutils.Utils.RetrofitUtils; import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * @author xzj * @date 2016/8/25 09:37. * 用于獲取配置好的retrofit對象 * 需要先調(diào)用setBaseUrl坐榆,如果項(xiàng)目中BaseUrl不變飞蛹,可以寫死 */ public class RetrofitFactory { private static Retrofit retrofit; private static String baseUrl; public static void setBaseUrl(String url) { baseUrl = url; } /** * 獲取配置好的retrofit對象來生產(chǎn)Manager對象 */ public static Retrofit getRetrofit() { if (retrofit == null) { if (baseUrl == null || baseUrl.length() <= 0) throw new IllegalStateException("請?jiān)谡{(diào)用getFactory之前先調(diào)用setBaseUrl"); Retrofit.Builder builder = new Retrofit.Builder(); builder.baseUrl(baseUrl) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 參考RxJava .addConverterFactory(GsonConverterFactory.create()); // 參考與GSON的結(jié)合 // 參考自定義Log輸出 OkHttpClient client = new OkHttpClient().newBuilder() // .addInterceptor(new Interceptor() { //這個(gè)攔截器是操作請求頭的 // @Override // public Response intercept(Chain chain) throws IOException { // Request request = chain.request().newBuilder() // .addHeader("version", "123411") //這里就是添加一個(gè)請求頭 // .build(); // //// Buffer buffer = new Buffer(); 不依賴下面的Interceptor姑尺,用這三行也能打印出請求體 //// request.body().writeTo(buffer); //// Log.d(getClass().getSimpleName(), "intercept: " + buffer.readUtf8()); // // return chain.proceed(request); // } // }) // .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) //這個(gè)攔截器是用來打印日志的清焕,不穩(wěn)定 .build(); builder.client(client); retrofit = builder.build(); } return retrofit; } }
package com.aidebar.retrofitutils.Utils.RetrofitUtils; import java.util.HashMap; /** * @author xzj * @date 2016/8/25 09:38. * 通過定義好的api接口以及Retrofit來生成具體的實(shí)例. */ public class ApiFactory { private static ApiFactory factory; private static HashMap<String, Object> serviceMap = new HashMap<>(); public static ApiFactory getFactory() { if (factory == null) { synchronized (ApiFactory.class) { if (factory == null) factory = new ApiFactory(); } } return factory; } public <T> T create(Class<T> clz) { Object service = serviceMap.get(clz.getName()); if (service == null) { service = RetrofitFactory.getRetrofit().create(clz); serviceMap.put(clz.getName(), service); } return (T) service; } }
還有2個(gè)是用rxjava進(jìn)行配合的可以選用
package com.aidebar.retrofitutils.Utils.RetrofitUtils;
import android.content.Context;
import android.widget.Toast;
import com.aidebar.retrofitutils.R;
import com.aidebar.retrofitutils.Utils.RetrofitUtils.JsonBean.BaseJsonBean;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import retrofit2.adapter.rxjava.HttpException;
import rx.Subscriber;
/**
* @author xzj
* @date 2016/8/25 11:07.
*/
public abstract class ResponseSubscriber<T> extends Subscriber<T> {
private Context mContext;
public ResponseSubscriber(Context context) {
mContext = context;
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if (!error(e)) {
if (e instanceof ConnectException) {
//網(wǎng)絡(luò)異常
Toast.makeText(mContext, R.string.network_error,Toast.LENGTH_SHORT).show();
} else if (e instanceof HttpException) {
//服務(wù)器異常
Toast.makeText(mContext, R.string.network_servier_error,Toast.LENGTH_SHORT).show();
} else if (e instanceof SocketTimeoutException) {
//網(wǎng)絡(luò)超時(shí)
Toast.makeText(mContext, R.string.network_timeout,Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext,e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onNext(T t) {
BaseJsonBean data;
if (t instanceof BaseJsonBean) {
data = (BaseJsonBean) t;
if (data.success) { //服務(wù)端返回的是true
success(t);
} else { //服務(wù)端返回false并蝗,就是操作異常
if (!operationError(t, data.errorCode, data.msg)) { //可以復(fù)寫此方法祭犯,返回true,就用戶自己處理滚停,返回false沃粗,走下面的代碼
Toast.makeText(mContext,data.msg,Toast.LENGTH_SHORT).show();
}
}
} else {
success(t);
}
}
/**
* 請求成功同時(shí)業(yè)務(wù)成功的情況下會(huì)調(diào)用此函數(shù)
*/
public abstract void success(T t);
/**
* 請求成功但業(yè)務(wù)失敗的情況下會(huì)調(diào)用此函數(shù).
* @return 空實(shí)現(xiàn),默認(rèn)返回false键畴,執(zhí)行父類方法最盅。 用戶可以復(fù)寫此方法,返回true來自己處理
*/
public boolean operationError(T t, int errorCode, String message) {
return false;
}
/**
* 請求失敗的情況下會(huì)調(diào)用此函數(shù)
* @return 空實(shí)現(xiàn)起惕,默認(rèn)返回false涡贱,執(zhí)行父類方法。 用戶可以復(fù)寫此方法惹想,返回true來自己處理
*/
public boolean error(Throwable e) {
return false;
}
}
package com.aidebar.retrofitutils.Utils.RetrofitUtils;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* 用于對網(wǎng)絡(luò)請求的Observable做轉(zhuǎn)換.
* 配合{@link com.trello.rxlifecycle.ActivityLifecycleProvider#bindToLifecycle()}一起使用
* 可以將原始Observable綁定至Activity/Fragment生命周期, 同時(shí)聲明在IO線程運(yùn)行, 在main線程接收.
* 像這樣用
* manager.getAds().compose(new ResponseTransformer<>(this.<BaseJsonBean> bindToLifeCycle()));
*/
public class ResponseTransformer<T> implements Observable.Transformer<T, T> {
private Observable.Transformer<T, T> transformer;
public ResponseTransformer() {}
public ResponseTransformer(Observable.Transformer<T, T> t) {
transformer = t;
}
@Override
public Observable<T> call(Observable<T> source) {
if (transformer != null)
return transformer.call(source).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
else
return source.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}