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()); } });
Retrofit网络请求框架
最新推荐文章于 2024-04-16 22:24:41 发布