MVC模式

本文详细介绍了在MVC模式下如何封装和使用Okhttp进行网络请求,包括GET、POST请求及数据下载,同时展示了如何通过单例模式创建Okhttp客户端,并使用拦截器进行日志记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MVC模式中Okhttp的使用


首先封装Okhttp

添加Okhttp依赖、log拦截器依赖

implementation 'com.squareup.okhttp3:okhttp:3.12.1'//okhttp依赖
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'// log拦截器依赖

封装utils

public class OkhttpUtils {
    private static final long time = 60 * 1000;//常量
    private Handler handler = new Handler();//在主线程中回调
    private OkHttpClient client;//client对象

    private OkhttpUtils() {
        //设置拦截器
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        //设置级别打印所有
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        //TODO:单例创建client
        client = new OkHttpClient.Builder()
                .writeTimeout(time, TimeUnit.MILLISECONDS)
                .readTimeout(time, TimeUnit.MILLISECONDS)
                .connectTimeout(time, TimeUnit.MILLISECONDS)
                .build();

    }

    private static OkhttpUtils okhttpUtils = null;

    //双重校验锁 单例模式
    public static OkhttpUtils getInstance() {
        if (okhttpUtils == null) {
            synchronized (String.class) {
                if (okhttpUtils == null) {
                    okhttpUtils = new OkhttpUtils();
                }
            }
        }
        return okhttpUtils;
    }

    /**
     * get请求json数据
     *
     * @param url              网络接口
     * @param myOkhttpCallBack 接口返回数据
     */
    public void doGet(String url, final MyOkhttpCallBack myOkhttpCallBack) {
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                //子线程
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        //主线程
                        if (myOkhttpCallBack != null) {
                            myOkhttpCallBack.onError(message);
                        }
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String json = response.body().string();
                //子线程
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        //主线程
                        if (myOkhttpCallBack != null) {
                            myOkhttpCallBack.onOk(json);
                        }
                    }
                });
            }
        });
    }

    /**
     * post请求 做登录,注册
     *
     * @param url              网址接口
     * @param map              提供requestBody数据集合
     * @param myOkhttpCallBack 返回接口数据
     */
    public void doPost(String url,final HashMap<String, String> map, final MyOkhttpCallBack myOkhttpCallBack) {
        //获取builder对象
        FormBody.Builder builder = new FormBody.Builder();
        //遍历map集合:获得键直对的集合 遍历键直对集合分别获得键和值
        Set<Map.Entry<String, String>> entries = map.entrySet();
        for (Map.Entry<String, String> entry :
                entries) {
            builder.add(entry.getKey(),entry.getValue());
        }
        FormBody formBody = builder.build();

        Request request = new Request.Builder()
                .url(url)
                .post(formBody)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (myOkhttpCallBack != null) {
                            myOkhttpCallBack.onError(message);
                        }
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String json = response.body().string();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (myOkhttpCallBack!=null){
                            myOkhttpCallBack.onOk(json);
                        }
                    }
                });
            }
        });
    }

    /**
     * 网络下载数据
     * @param url
     * @param filePath
     * @param myOkhttpCallBack
     */
    public void downLoad(String url, final String filePath,final MyOkhttpCallBack myOkhttpCallBack){
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                final String message = e.getMessage();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (myOkhttpCallBack != null) {
                            myOkhttpCallBack.onError(message);
                        }
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                ResponseBody body = response.body();
                InputStream inputStream = body.byteStream();//字节流
                FileOutputStream fileOutputStream = new FileOutputStream(filePath);
                byte[] bytes = new byte[1024];
                int len = 0;
                int count = 0;//下载大小
                while ((len = inputStream.read(bytes)) != -1) {
                    fileOutputStream.write(bytes, 0, len);
                }
            }
        });
    }
}

封装时做的接口回调:

public interface MyOkhttpCallBack {
    void onOk(String json);//成功
    void onError(String message);//失败
}

Model层

实现接口

public interface UserMode {
    void getjson(String url, MyOkhttpCallBack myOkhttpCallBack);//获取网络json
    void loginOrRegister(String url, HashMap<String, String> map,MyOkhttpCallBack myOkhttpCallBack);//登录 或 注册方法
    void downLoad(String url, final String filePath, MyOkhttpCallBack myOkhttpCallBack);//网络请求数据
}

实现子类

public class UserModeImpl implements UserMode {

    @Override
    public void getjson(String url,MyOkhttpCallBack myOkhttpCallBack) {
        OkhttpUtils.getInstance().doGet(url,myOkhttpCallBack);
    }

    @Override
    public void loginOrRegister(String url, final HashMap<String, String> map,MyOkhttpCallBack myOkhttpCallBack) {
        OkhttpUtils.getInstance().doPost(url, map,myOkhttpCallBack);
    }

    @Override
    public void downLoad(String url, String filePath, MyOkhttpCallBack myOkhttpCallBack) {
        OkhttpUtils.getInstance().downLoad(url,filePath,myOkhttpCallBack);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值