public class RetrofitUtils2 {
public static OkHttpClient okHttpClient;
//创建私有属性
private static RetrofitUtils2 mInstance;
//创建ApiService引用
private static LogApi apiService;
private RetrofitUtils2() {
}
public LogApi getApiService() {
return apiService;
}
public static class Builder {
private List<CallAdapter.Factory> callAdapterFactorys = new ArrayList<>();
private List<Converter.Factory> convertFactorys = new ArrayList<>();
private String url;
public Builder addCallAdapterFactory(CallAdapter.Factory factory) {
callAdapterFactorys.add(factory);
return this;//返回this的目的是:可以链式调用
}
public Builder addConverterFactory(Converter.Factory factory) {
convertFactorys.add(factory);
return this;
}
public Builder addurl(String url) {
this.url = url;
return this;
}
public RetrofitUtils2 build() {
Retrofit.Builder builder = new Retrofit.Builder();
if (convertFactorys != null && convertFactorys.size() == 0) {
//如果集合中没有对象,我们添加默认的gson解析器
builder.addConverterFactory(GsonConverterFactory.create());
}
for (Converter.Factory convertFactory : convertFactorys) {
builder.addConverterFactory(convertFactory);
}
if (callAdapterFactorys != null && callAdapterFactorys.size() == 0) {
builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create());
}
for (CallAdapter.Factory callAdapterFactory : callAdapterFactorys) {
builder.addCallAdapterFactory(callAdapterFactory);
}
Retrofit retrofit = builder.client(getOkHttpClient()).baseUrl(url)
.build();
apiService = retrofit.create(LogApi.class);
mInstance = new RetrofitUtils2();
return mInstance;
}
}
//单例模式获取okhttp
public static OkHttpClient getOkHttpClient(){
if(okHttpClient==null){
synchronized (OkHttpClient.class){
if(okHttpClient==null){
File fileDir = new File(Environment.getExternalStorageDirectory(), "cache");
long fileSize = 10 * 1024 * 1024;
okHttpClient=new OkHttpClient.Builder().addInterceptor(new MyInter())
//打印拦截器日志
.addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.connectTimeout(15, TimeUnit.SECONDS)//设置连接超时时间
.readTimeout(15, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(15, TimeUnit.SECONDS)//设置写入超时时间
//.cache(new Cache(fileDir,fileSize))//写入sd卡
.build();
}
}
}
return okHttpClient;
}
//拦截器
static class MyInter implements Interceptor {
private int versionCode;
private Context context;
private SharedPreferences jiLu;
private String token;
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder request_builder = request.newBuilder();
context = MyApp.con;
jiLu = context.getSharedPreferences("JiLu", 0);
if(jiLu!=null){
token = jiLu.getString("token", null);
}
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
versionCode = pi.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if("GET".equals(request.method()))
{
HttpUrl.Builder builder = request.url().newBuilder();
HttpUrl build = builder.addQueryParameter("source", ApiConstants.source)
.addQueryParameter("appVersion", versionCode + "")
.addQueryParameter("token", token + "")
.build();
request = request_builder.url(build).build();
}
if ("POST".equals(request.method())) {
if (request.body() instanceof FormBody) {
System.out.println("FormBody开始添加公共参数");
FormBody.Builder builder = new FormBody.Builder();
FormBody body = (FormBody) request.body();
for (int i = 0; i < body.size(); i++) {
builder.add(body.encodedName(i), body.encodedValue(i));
}
body = builder.add("source",ApiConstants.source)
.add("appVersion", String.valueOf(versionCode))
.add("token", token+"")
.build();
System.out.println("开始添加公共参数55555" );
request = request_builder.post(body).build();
}
//因为传送文件要用到 @Multipart注解
else if(request.body() instanceof MultipartBody)
{
MultipartBody body = (MultipartBody) request.body();
MultipartBody.Builder builder=new MultipartBody.Builder().setType(MultipartBody.FORM);
builder.addFormDataPart("source","android")
.addFormDataPart("appVersion",versionCode+"")
.addFormDataPart("token",token+"");
List<MultipartBody.Part> parts = body.parts();
for (MultipartBody.Part part : parts) {
builder.addPart(part);
}
request=request_builder.post(builder.build()).build();
}
}
return chain.proceed(request);
}
/**
* 添加公共参数
*
* @param oldRequest
* @return
*/
private Request addParam(Request oldRequest) {
jiLu = context.getSharedPreferences("JiLu", 0);
if(jiLu!=null){
token = jiLu.getString("token", null);
}
PackageInfo packageArchiveInfo = MyApp.con.getPackageManager().getPackageArchiveInfo(MyApp.con.getPackageName(), 0);
int versionCode = packageArchiveInfo.versionCode;
HttpUrl.Builder builder = oldRequest.url()
.newBuilder()
.setEncodedQueryParameter("source", "android")
.setEncodedQueryParameter("token",token)
.setEncodedQueryParameter("appVersion",versionCode+"")
;
Request newRequest = oldRequest.newBuilder()
.method(oldRequest.method(), oldRequest.body())
.url(builder.build())
.build();
return newRequest;
}
}
}
//使用方法
Map<String,String> map = new HashMap<>();
map.put("page",page);
if(HomeActivity.getToken()!=null) {
map.put("token", HomeActivity.getToken());
}else{
map.put("token","asa4sd4aasds");
}
RetrofitUtils2 build = new RetrofitUtils2.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.addurl(ApiConstants.LOGIN_URL)
.build();
LogApi apiService = build.getApiService();
apiService.vedio(map).enqueue(new Callback<RechotBean>() {
@Override
public void onResponse(Call<RechotBean> call, Response<RechotBean> response) {
RechotBean body = response.body();
getvedioListener.success(body);
}
@Override
public void onFailure(Call<RechotBean> call, Throwable t) {
getvedioListener.error(t.toString());
}
});