package com.reach.doooly.http.client;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.ObservableTransformer;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.ConnectionPool;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.fastjson.FastJsonConverterFactory;
import android.annotation.SuppressLint;
import android.content.Context;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.reach.doooly.http.base.BaseApiService;
import com.reach.doooly.http.base.CommResultBeanVo;
import com.reach.doooly.http.converfactory.StringConverterFactory;
import com.reach.doooly.http.cookie.CookieCacheImpl;
import com.reach.doooly.http.cookie.CookieManager;
import com.reach.doooly.http.cookie.SharedPrefsCookiePersistor;
import com.reach.doooly.http.errorhandler.NetException;
import com.reach.doooly.http.errorhandler.RxErrorHandlingCallAdapterFactory;
import com.reach.doooly.http.interceptor.DefaultHeaderInterceptor;
import com.reach.doooly.http.interceptor.OfflineCacheControlInterceptor;
import com.reach.doooly.http.util.Util;
import com.reach.doooly.utils.StringUtlis;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
/**
* @author qinming.fu@reach-core.com
* <p>
* {@link # https://github.com/NeglectedByBoss/RetrofitClient}
*/
public final class Client {
public static final String TAG = "RetrofitClient";
private static Retrofit.Builder retrofitBuilder;
private static OkHttpClient.Builder okhttpBuilder;
@SuppressLint("StaticFieldLeak")
private static Context mContext;
private static BaseApiService apiService;
public static void init(Context context) {
mContext = context;
}
/**
* methodHandler
*/
private static List<Type> methodHandler(Type[] types) {
List<Type> needTypes = new ArrayList<>();
for (Type paramType : types) {
// if Type is T
if (paramType instanceof ParameterizedType) {
Type[] parenTypes = ((ParameterizedType) paramType).getActualTypeArguments();
for (Type childType : parenTypes) {
needTypes.add(childType);
if (childType instanceof ParameterizedType) {
Type[] childtypes = ((ParameterizedType) childType).getActualTypeArguments();
Collections.addAll(needTypes, childtypes);
}
}
}
}
return needTypes;
}
private static <T> Type getFinalType(final Observer<T> observable) {
final Type[] types = observable.getClass().getGenericInterfaces();
if (methodHandler(types) == null || methodHandler(types).size() == 0) {
return null;
}
return methodHandler(types).get(0);
}
private final ObservableTransformer schedulersTransformer = new ObservableTransformer() {
@Override
public ObservableSource apply(Observable upstream) {
return upstream.subscribeOn(Schedulers.io())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
}
};
private <T> Function parseBaseResultFunction(final Type type) {
return new Function() {
@Override
public T apply(Object o) throws Exception {
ResponseBody body = (ResponseBody) o;
byte[] bytes = body.bytes();
CommResultBeanVo result = null;
try {
//result=new Gson().fromJson(new String(bytes),CommResultBeanVo.class);[不可这样使用,gson要求后面数据类型必须一样一样的]
result = JSON.parseObject(new String(bytes), new TypeReference<CommResultBeanVo>() {
});
} catch (Exception e) {
result = null;
}
if (result != null && !StringUtlis.isEmpty(result.getCode())) {
int code=-1;
try{
code=Integer.parseInt(result.getCode());
}catch (Exception e){
code=-1;
}
if (code==ClientCode.SUCCESS_CODE) {
} else {
String errMsg = result.getMessage();
if (StringUtlis.isEmpty(errMsg)) {
errMsg = "";
}
throw new NetException(code, errMsg);
}
} else {
throw new NetException(-1, "");
}
return (T) result;
}
};
}
@SuppressWarnings("unchecked")
private <T> void compose(Observable respBody, final Observer<T> observer, ObservableTransformer transformer) {
if (transformer != null) {
respBody.compose(schedulersTransformer).compose(transformer).subscribe(observer);
} else {
respBody.compose(schedulersTransformer).subscribe(observer);
}
}
public <T> void get(final String path, final Map<String, Object> parameters, final Observer<T> observer) {
Observable respBody = apiService.get(path, parameters).map(parseBaseResultFunction(getFinalType(observer)));
compose(respBody, observer, null);
}
public <T> void postForm(final String path, final Map<String, Object> parameters, final Observer<T> observer) {
Observable respBody = apiService.post(path, parameters).map(parseBaseResultFunction(getFinalType(observer)));
compose(respBody, observer, null);
}
public <T> void postJson(final String path, final Map<String, Object> parameters, final Observer<T> observer) {
RequestBody body = Util.createJsonBody(Util.jsonStringFromMap(parameters));
Observable respBody = apiService.postJson(path, body).map(parseBaseResultFunction(getFinalType(observer)));
compose(respBody, observer, null);
}
public <T> void postJson(final String path, final Map<String, Object> parameters, final Observer<T> observer, Type type, final ObservableTransformer transformer) {
RequestBody body = Util.createJsonBody(Util.jsonStringFromMap(parameters));
Observable respBody = apiService.postJson(path, body).map(parseBaseResultFunction(type));
compose(respBody, observer, transformer);
}
public static final class Builder {
private static final int TIMEOUT_READ = 15;
private static final int TIMEOUT_CONNECTION = 15;
private static final int DEFAULT_MAXIDLE_CONNECTIONS = 5;
private static final long DEFAULT_KEEP_ALIVEDURATION = 8;
private static final long CACHE_MAX_SIZE = 10 * 1024 * 1024;
private String baseUrl;
public Builder() {
// Add the base url first. This prevents overriding its behavior but also
// ensures correct behavior when using novate that consume all types.
okhttpBuilder = new OkHttpClient.Builder();
retrofitBuilder = new Retrofit.Builder();
}
/**
* Create the {@link Retrofit} instance using the configured values.
* <p/>
* Note:
没有合适的资源?快使用搜索试试~ 我知道了~
android Retrofit+OKhttp实现接口调用
共26个文件
java:26个
需积分: 42 9 下载量 169 浏览量
2017-10-16
17:34:42
上传
评论
收藏 20KB RAR 举报
温馨提示
android Retrofit+OKhttp实现接口调用base类,资源保存,方便自己or他人开发使用
资源推荐
资源详情
资源评论
收起资源包目录
http.rar (26个子文件)
http
interceptor
ForceCachedInterceptor.java 1KB
DefaultHeaderInterceptor.java 1008B
OAuthInterceptor.java 1KB
OfflineCacheControlInterceptor.java 2KB
UserAgentInterceptor.java 1KB
client
ClientCode.java 245B
Client.java 12KB
base
CommResultBeanVo.java 1KB
PackageInfoProvider.java 874B
BaseApiService.java 2KB
BaseResult.java 929B
converfactory
StringConverter.java 507B
StringConverterFactory.java 958B
errorhandler
RxErrorHandlingCallAdapterFactory.java 4KB
NetException.java 1KB
util
Util.java 2KB
network
Reachability.java 5KB
NetworkReceiver.java 421B
cookie
CookieCache.java 561B
IdentifiableCookie.java 2KB
ClearableCookieJar.java 488B
CookieCacheImpl.java 1KB
SerializableCookie.java 5KB
SharedPrefsCookiePersistor.java 2KB
CookieManager.java 2KB
CookiePersistor.java 755B
共 26 条
- 1
资源评论
CherryChen88
- 粉丝: 48
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功