一、首先添加项目依赖:
implementation "com.squareup.okhttp3:logging-interceptor:$var.loggingInterceptor"
implementation "com.squareup.okhttp3:okhttp:$var.okhttp"
implementation "com.squareup.retrofit2:retrofit:$var.retrofit"
implementation "com.google.code.gson:gson:$var.gson"
implementation "com.squareup.retrofit2:converter-gson:$var.converterGson"
implementation "com.squareup.retrofit2:adapter-rxjava:$var.adapterRxjava"
implementation "io.reactivex:rxandroid:$var.rxandroid"
implementation "io.reactivex:rxjava:$var.rxjava"
implementation "com.squareup.retrofit2:converter-scalars:$var.converterScalars"
二、创建接口调用类
public interface APIService {
/**
* post方式请求网络参数
*
* @param token 请求参数
* @return
*/
@FormUrlEncoded
@POST("AppInfo.php")
Observable> getAppInfo(@Field("token") String token);
@FormUrlEncoded
@POST("FunctionList.php")
Observable>> getFunctionList(@Field("token") String token);
}
三、封装retrofit
public class HttpMethods {
private static final String BASE_URL = "http://xxxxxxxxxxxxxx";
private static final long DEFAULT_TIME = 10000L;
private Retrofit retrofit;
private final String TAG = HttpMethods.class.getSimpleName();
private static class SingletonHolder {
private static final HttpMethods INSTANCE = new HttpMethods();
}
private HttpMethods() {
//拦截并打印日志信息
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
LogUtils.setTag(TAG);
LogUtils.json(message);
}
}).setLevel(HttpLoggingInterceptor.Level.BODY);
//初始化OKHttp
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(DEFAULT_TIME, TimeUnit.SECONDS)
.readTimeout(DEFAULT_TIME, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_TIME, TimeUnit.SECONDS)
.addInterceptor(httpLoggingInterceptor)
.retryOnConnectionFailure(true)
.build();
//初始化Retrofit
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
public static HttpMethods getInstance() {
return SingletonHolder.INSTANCE;
}
public T createService(Class clazz) {
return retrofit.create(clazz);
}
}
四、返回数据统一封装
public class BaseEntity implements Serializable{
private int code;
private String message;
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
五、统一线程调度
public class DefaultTransformer<T> implements Observable.Transformer<T, T> {
@Override
public Observable call(Observable tObservable) {
return tObservable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Func1() {
@Override
public T call(T t) {
BaseEntity baseEntity = (BaseEntity) t;
if (baseEntity.getCode() != 200) {
throw new APIException(baseEntity.getCode(), baseEntity.getMessage());
}
return t;
}
});
}
public static DefaultTransformer create(){
return new DefaultTransformer<>();
}
}
六、返回错误统一处理
public abstract class APISubscriber extends Subscriber {
private final String TAG = APISubscriber.class.getSimpleName();
private QMUITipDialog tipDialog;
protected APISubscriber() {
}
protected APISubscriber(Context context) {
QMUITipDialog.Builder builder = new QMUITipDialog.Builder(context);
builder.setTipWord("加载中");
builder.setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING);
tipDialog = builder.create();
tipDialog.setCancelable(true);
}
@Override
public void onStart() {
super.onStart();
if (tipDialog != null) {
tipDialog.show();
}
}
@Override
public void onCompleted() {
if (tipDialog != null && tipDialog.isShowing()) {
tipDialog.dismiss();
}
}
@Override
public void onError(Throwable e) {
if (tipDialog != null && tipDialog.isShowing())
tipDialog.dismiss();
if (e instanceof APIException) {
LogUtils.e("处理服务器返回的错误");
} else if (e instanceof ConnectException) {
LogUtils.e("网络异常,请检查网络");
} else if (e instanceof TimeoutException || e instanceof SocketException) {
LogUtils.e("网络异常,请检查网络");
} else if (e instanceof JsonSyntaxException) {
LogUtils.e("数据解析异常");
} else {
LogUtils.e("服务端异常");
}
e.printStackTrace();
}
}
七、使用
/**
* 获取APP版本信息
*
* @param aty
*/
public void getAppInfo(final FunctionListAty aty) {
final Subscription subscription = HttpMethods.getInstance()
.createService(APIService.class)
.getAppInfo("123")
.compose(DefaultTransformer.>create())
.subscribe(new APISubscriber>(aty) {
@Override
public void onNext(BaseEntity appInfoBaseEntity) {
AppInfo appInfo = appInfoBaseEntity.getData();
if (appInfo != null) {
Constants.DEFAULT_URL = appInfo.getApp_download_url();
new UpdateManager(aty, appInfo).checkUpdate();
}
}
});
aty.addSubscription(subscription);
}
八、连续请求多个接口
/**
* 多个请求合并
*/
public void getRequest(final FunctionListAty aty) {
final APIService apiService = HttpMethods.getInstance().createService(APIService.class);
Observable> appInfo = apiService.getAppInfo("123");
Observable>> functionList = apiService.getFunctionList("123");
final Subscription subscription = Observable.mergeDelayError(appInfo, functionList)
.compose(DefaultTransformer.create())
.subscribe(new APISubscriber