美文网首页
retrofit2.0 封装

retrofit2.0 封装

作者: Thor_果冻 | 来源:发表于2019-01-03 15:14 被阅读0次
    /**
     * 类描述:网络请求管理 <br/>
     * 创建人:吴冬冬<br/>
     * 创建时间:2017/8/4 15:58 <br/>
     */
    
    public class HttpManger {
        public static final int HTTP_MANGER_CIRCLE = 10010;
    
        private static Context mContext;
        private static HttpManger mHttpManger;
        private static OkHttpClient.Builder okhttpBuilder;
        private static Retrofit.Builder retrofitBuilder;
        private static OkHttpClient okHttpClient;
        private static Retrofit retrofit;
        public static BaseApiService apiManager;
    
        private final String baseUrl;
        private boolean isShowLoading = false;
        private int isShowLoadingType = HTTP_MANGER_CIRCLE;
    
        private HttpManger(String baseUrl, BaseApiService apiManager, boolean isShowLoading, int isShowLoadingType){
            this.baseUrl = baseUrl;
            this.apiManager = apiManager;
            this.isShowLoading = isShowLoading;
            this.isShowLoadingType = isShowLoadingType;
        }
    
    
        public void executeGet(Context context, final String url, RetrofitCallback retrofitCallback) {
            Call<ResponseBody> call = apiManager.executeGet(url);
            if (isShowLoading == true) {
                retrofitCallback.addShowLoading(context, isShowLoading, isShowLoadingType);
            }
            call.enqueue(retrofitCallback);
        }
    
        public void executeGet(Context context, final String url, @QueryMap(encoded = true) final Map<String, String> maps, RetrofitCallback retrofitCallback) {
            Call<ResponseBody> call = apiManager.executeGet(url, maps);
            if (isShowLoading == true) {
                retrofitCallback.addShowLoading(context, isShowLoading, isShowLoadingType);
            }
            call.enqueue(retrofitCallback);
        }
    
        public void executePost(Context context, final String url, @FieldMap(encoded = true) final Map<String, String> maps, RetrofitCallback retrofitCallback) {
            Call<ResponseBody> call = apiManager.executePost(url, maps);
            if (isShowLoading == true) {
                retrofitCallback.addShowLoading(context, isShowLoading, isShowLoadingType);
            }
            call.enqueue(retrofitCallback);
        }
    
    
        public static final class Builder {
            private static final int DEFAULT_TIMEOUT = 15;
    
            private Context context;
            private String baseUrl;
            private boolean isLog = false;
            private Converter.Factory converterFactory;
            private boolean isShowLoading = false;
            private int isShowLoadingType = HTTP_MANGER_CIRCLE;
    
            public Builder(Context context) {
                okhttpBuilder = new OkHttpClient.Builder();
                retrofitBuilder = new Retrofit.Builder();
                if(context instanceof Activity) {
                    this.context  = ((Activity) context).getApplicationContext();
                } else {
                    this.context = context;
                }
            }
    
            /**
             * 添加默认地址
             */
            public Builder baseUrl(String baseUrl) {
                this.baseUrl = Utils.checkNotNull(baseUrl, "baseUrl == null");
                return this;
            }
    
            /**
             * 设置okhttpClient
             */
            @NonNull
            public Builder client(OkHttpClient client) {
                retrofitBuilder.client(Utils.checkNotNull(client, "client == null"));
                return this;
            }
    
            /**
             * 设置连接时间
             */
            public Builder connectTimeout(int timeout) {
                return connectTimeout(timeout, TimeUnit.SECONDS);
            }
            public Builder connectTimeout(int timeout, TimeUnit unit) {
                if (timeout != -1) {
                    okhttpBuilder.connectTimeout(timeout, unit);
                } else {
                    okhttpBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
                }
                return this;
            }
    
            /**
             * 设置写时间
             */
            public Builder writeTimeout(int timeout) {
                return writeTimeout(timeout, TimeUnit.SECONDS);
            }
            public Builder writeTimeout(int timeout, TimeUnit unit) {
                if (timeout != -1) {
                    okhttpBuilder.writeTimeout(timeout, unit);
                } else {
                    okhttpBuilder.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
                }
                return this;
            }
    
            /**
             * 设置读时间
             */
            public Builder readTimeout(int timeout) {
                return readTimeout(timeout, TimeUnit.SECONDS);
            }
            public Builder readTimeout(int timeout, TimeUnit unit) {
                if (timeout != -1) {
                    okhttpBuilder.readTimeout(timeout, unit);
                } else {
                    okhttpBuilder.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
                }
                return this;
            }
    
            /**
             * 设置是否显示网络连接log
             */
            public Builder addLog(boolean isLog) {
                this.isLog = isLog;
                return this;
            }
    
            /**
             * 是否显示加载框
             */
            public Builder addShowLoading(boolean isShowLoading){
                this.isShowLoading = isShowLoading;
                return this;
            }
            /**
             * 是否显示加载框
             */
            public Builder addShowLoading(boolean isShowLoading, int type){
                this.isShowLoading = isShowLoading;
                this.isShowLoadingType = type;
                return this;
            }
    
            /**
             * 设置添加gson解析fastJson解析。。。
             */
            public Builder addConverterFactory(Converter.Factory factory) {
                this.converterFactory = factory;
                return this;
            }
    
            public HttpManger build() {
    
                if (baseUrl == null) {
                    throw new IllegalStateException("Base URL required.");
                }
    
                if (okhttpBuilder == null) {
                    throw new IllegalStateException("okhttpBuilder required.");
                }
    
                if (retrofitBuilder == null) {
                    throw new IllegalStateException("retrofitBuilder required.");
                }
    
                mContext = context;
    
                //ConfigLoader.init(context);
    
                retrofitBuilder.baseUrl(baseUrl);
    
                //gson
                /*if (converterFactory == null) {
                    converterFactory = GsonConverterFactory.create();
                }*/
                if (converterFactory != null) {
                    retrofitBuilder.addConverterFactory(converterFactory);
                }
    
    
                //rxjava
                /*if (callAdapterFactory == null) {
                    callAdapterFactory = RxJavaCallAdapterFactory.create();
                }
                retrofitBuilder.addCallAdapterFactory(callAdapterFactory);*/
    
                //LogWraper.setDebug(isLog && !BuildConfig.DEBUG);
    
    
                if (isLog) {
                    okhttpBuilder.addNetworkInterceptor(
                            new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.HEADERS));
    
                    okhttpBuilder.addNetworkInterceptor(
                            new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));
                }
    
                okHttpClient = okhttpBuilder.build();
    
                retrofitBuilder.client(okHttpClient);
    
                retrofit = retrofitBuilder.build();
    
                apiManager = retrofit.create(BaseApiService.class);
    
                return new HttpManger(baseUrl, apiManager, isShowLoading, isShowLoadingType);
            }
        }
    }
    

    /**
     * 类描述:retrofit接口服务<br/>
     * 创建人:吴冬冬<br/>
     * 创建时间:2017/8/4 14:51 <br/>
     */
    
    public interface BaseApiService {
        /**
         * @Url 替换url
         * @QueryMap 替换url中查询参数
         * @Header 替换header
         * @FieldMap 替换post请求body中参数
         * @FormUrlEncoded post请求需要加的方法注解
         * @POST() 标示该方法为post请求
         * @GET() 标示该方法为get请求
         */
    
        @GET()
        Call<ResponseBody> executeGet(@Url String url);
    
    
        //@GET("{path}")
        //Call<ResponseBody> executeGet(@Path("path") String path, @QueryMap Map<String, String> datas);
        //如果上面这种写法或出现URL异常
        //  http://api.myapi.com/http%3A%2F%2Fapi.mysite.com%2Fuser%2Flist
        //@GET("{path}")
        //Call<ResponseBody> executeGet(@Path(value = "path", encoded = true) String path, @QueryMap Map<String, String> datas);
        @GET()
        Call<ResponseBody> executeGet(@Url String url, @QueryMap Map<String, String> datas);
    
        //@FormUrlEncoded//如果使用fileMap必须加上encoded注解
        //@POST("{path}")
        //Call<ResponseBody> postMethod(@Path(value = "path", encoded = true) String path, @FieldMap Map<String, String> dates);
        @FormUrlEncoded//如果使用fileMap必须加上encoded注解
        @POST()
        Call<ResponseBody> executePost(@Url String url, @FieldMap Map<String, String> dates);
    }
    

    /**
     * 类描述: <br/>
     * 创建人:吴冬冬<br/>
     * 创建时间:2017/8/4 18:26 <br/>
     */
    
    public abstract class RetrofitCallback implements Callback {
    
        private ProgressDialog mProgressDialog;
    
        /**
         * 成功中也会可能有错误信息,如账号错误之类的
         */
        public abstract void onSuccess(String success);
        public abstract void onError(String error);
    
    
        public void addShowLoading(Context context, boolean isShowLoading, int isShowLoadingType){
            if (isShowLoading) {
                if (isShowLoadingType == HttpManger.HTTP_MANGER_CIRCLE) {//无限循环
                    mProgressDialog = new ProgressDialog(context);
                    mProgressDialog.setMessage(context.getString(R.string.net_loading));
                } else {
                    //其他类型加载框
                }
                if (mProgressDialog != null) {
                    mProgressDialog.show();
                }
            }
        }
    
        @Override
        public void onResponse(Call call, Response response) {
            if (mProgressDialog.isShowing()) {
                mProgressDialog.dismiss();
            }
            if (response.isSuccessful()) {
                onSuccess(response.body().toString());
            }
        }
    
        @Override
        public void onFailure(Call call, Throwable t) {
            if (mProgressDialog.isShowing()) {
                mProgressDialog.dismiss();
            }
            if (t != null && t.getMessage() != null) {
                onError(t.getMessage());
            }
        }
    
    
    }
    

    /**
     * 类描述:工具类 <br/>
     * 创建人:吴冬冬<br/>
     * 创建时间:2017/8/4 17:20 <br/>
     */
    
    public class Utils {
        public static <T> T checkNotNull(T object, String message) {
            if (object == null) {
                throw new NullPointerException(message);
            }
            return object;
        }
    }
    

    相关文章

      网友评论

          本文标题:retrofit2.0 封装

          本文链接:https://www.haomeiwen.com/subject/dsjplqtx.html