封装OkHttp的网络请求

加入OkHttpUtils的依赖

dependencies {
    compile 'com.squareup.okhttp3:okhttp:3.9.1'
}

这里分成MVP模式,M层代码:

public class OkUtils {
    //单例模式
    private static volatile OkUtils intance;
    private void OKUtils(){};
    public static OkUtils setInstance(){
        if(intance == null){
        //二次封装
            synchronized (OkUtils.class){
                if(intance == null){
                    intance = new OkUtils();
                }
            }
        }
        return intance;
    }
    //实例化接口
    private OkUtilsInterface okUtilsInterface;
    public void setOkUtilsInterface(OkUtilsInterface okUtilsInterface){
        this.okUtilsInterface = okUtilsInterface;
    }
    //定义一个Handler线程,发送到主线程
    private Handler handler = new Handler();
    //定义get请求
    public void get(String url, final OkUtilsInterface okUtilsInterface, final Class bean, final String tag){
        OkHttpClient okHttpClient = new OkHttpClient();
        //添加拦截器(如果不要求,可以不做)
                /*.Builder()
                .addInterceptor(new Lanjie())
                .build();*/

        Request build = new Request.Builder()
                .get()
                .url(url)
                .build();

        Call call = okHttpClient.newCall(build);
        call.enqueue(new Callback() {
        //请求网络失败的方法
            @Override
            public void onFailure(Call call, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        okUtilsInterface.OkUtilsFailed(e.getMessage());
                    }
                });
            }
        //请求网络成功的方法
            @Override
            public void onResponse(Call call, Response response) throws IOException {
            //获取返回的Json串
                final String string = response.body().string();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                    //解析Json串
                        Object o = GsonUtils.setGson().fromJson(string, bean);
                        okUtilsInterface.OkUtilsSuccess(o,tag);
                    }
                });
            }
        });
    }

    //post请求(跟上面差不多)
    public void post(String url, Map<String,String> map, final OkUtilsInterface okUtilsInterface, final Class bean, final String tag){
        OkHttpClient okHttpClient = new OkHttpClient();
            //添加拦截器(如果不要求,可以不做)
                /*.Builder()
                .addInterceptor(new Lanjie())
                .build();*/
                //post请求,将拼接的参数通过Map集合放进body中
        FormBody.Builder builder = new FormBody.Builder();
        for (Map.Entry<String,String> entry:map.entrySet()){
            builder.add(entry.getKey(),entry.getValue());
            Log.e("-------",entry.getKey()+"------"+entry.getValue());
        }
        //在post中添加body,别忘了创建(.build)
        Request build = new Request.Builder()
                .post(builder.build())
                .url(url)
                .build();
        Call call = okHttpClient.newCall(build);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        okUtilsInterface.OkUtilsFailed(e.getMessage());
                    }
                });
            }

            @Override
            public void onResponse(final Call call, Response response) throws IOException {
                final String string = response.body().string();
                Log.e("----------",string.toString());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Object o = GsonUtils.setGson().fromJson(string, bean);
                        okUtilsInterface.OkUtilsSuccess(o,tag);
                    }
                });
            }
        });
    }
}

M层自定义接口::

public interface OkUtilsInterface {
    void OkUtilsSuccess(Object o,String tag);
    void OkUtilsFailed(String message);
}

P层代码:

public class Persenter {
    //实例化接口
    private PersenterInterface persenterInterface;
    public void setPersenterInterface(PersenterInterface persenterInterface){
        this.persenterInterface = persenterInterface;
    }
    //定义一个方法用来传递参数
    public void get(String url, Class bean, final String tag){
        //调用请求数据层的方法
        OkUtils.setInstance().get(url, new OkUtilsInterface() {
            @Override
            public void OkUtilsSuccess(Object o,String tag) {
                persenterInterface.PersenterSuccess(o,tag);
            }

            @Override
            public void OkUtilsFailed(String message) {
                persenterInterface.PersenterFailed(message);
            }
        },bean,tag);
    }

    //定义的post请求的方法
    public void post(String url, Map<String,String> map, Class bean, final String tag){
        OkUtils.setInstance().post(url, map, new OkUtilsInterface() {
            @Override
            public void OkUtilsSuccess(Object o,String tag) {
                persenterInterface.PersenterSuccess(o,tag);
            }

            @Override
            public void OkUtilsFailed(String message) {
                persenterInterface.PersenterFailed(message);
            }
        },bean,tag);
    }
}

P层接口

public interface PersenterInterface {
    void PersenterSuccess(Object o,String tag);
    void PersenterFailed(String message);
}

拦截器的代码块(不懂啥意思):

public class Lanjie implements Interceptor {
     @Override
     public Response intercept(Chain chain) throws IOException {
         Request request = chain.request();
         Request newRequest = chain.request().newBuilder()
                 .addHeader("source", "android")
                 .url(request.url())
                 .build();
         return chain.proceed(newRequest);
     }
 }

Gson解析的类

public class GsonUtils {
    public static Gson gson;
    public static Gson setGson(){
        if(gson == null){
            synchronized (GsonUtils.class){
                if(gson == null){
                    gson = new Gson();
                }
            }
        }
        return gson;
    }
}

V层就不用写了,只需要实例化P类,在调用P层的方法,传进参数,实现接口,就能获取网络请求到的数据了….

猜你喜欢

转载自blog.csdn.net/dealpoor/article/details/78611308