okHttp的一个工具类

来源:互联网 发布:sql2008新建数据库 编辑:程序博客网 时间:2024/06/05 02:36

要封装一个OKttp的有个工具类,下面是工具类的代码

public class OkHttp3Util {    /**     * 懒汉 安全 加同步     * 私有的静态成员变量 只声明不创建     * 私有的构造方法     * 提供返回实例的静态方法     */    private static OkHttpClient okHttpClient = null;    private OkHttp3Util() {    }    public static OkHttpClient getInstance() {        if (okHttpClient == null) {            //加同步安全            synchronized (OkHttp3Util.class) {                if (okHttpClient == null) {                    //okhttp可以缓存数据....指定缓存路径                    File sdcache = new File(Environment.getExternalStorageDirectory(), "cache");                    //指定缓存大小                    int cacheSize = 10 * 1024 * 1024;                    okHttpClient = new OkHttpClient.Builder()//构建器                            .connectTimeout(15, TimeUnit.SECONDS)//连接超时                            .writeTimeout(20, TimeUnit.SECONDS)//写入超时                            .readTimeout(20, TimeUnit.SECONDS)//读取超时                            .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize))//设置缓存                            .build();                }            }        }        return okHttpClient;    }    /**     * get请求     * 参数1 url     * 参数2 回调Callback     */    public static void doGet(String url, Callback callback) {        //创建OkHttpClient请求对象        OkHttpClient okHttpClient = getInstance();        //创建Request        Request request = new Request.Builder().url(url).build();        //得到Call对象        Call call = okHttpClient.newCall(request);        //执行异步请求        call.enqueue(callback);    }    /**     * post请求     * 参数1 url     * 参数2 Map<String, String> params post请求的时候给服务器传的数据     *      add..("","")     *      add()     */    public static void doPost(String url, Map<String, String> params, Callback callback) {        //创建OkHttpClient请求对象        OkHttpClient okHttpClient = getInstance();        //3.x版本post请求换成FormBody 封装键值对参数        FormBody.Builder builder = new FormBody.Builder();        //遍历集合        for (String key : params.keySet()) {            builder.add(key, params.get(key));            Log.d("++++++++++++++",params.get(key));        }        //创建Request        Request request = new Request.Builder().url(url).post(builder.build()).build();        Call call = okHttpClient.newCall(request);        call.enqueue(callback);    }    /**     * post请求上传文件....包括图片....流的形式传任意文件...     * 参数1 url     * file表示上传的文件     * fileName....文件的名字,,例如aaa.jpg     * params ....传递除了file文件 其他的参数放到map集合     *     */    public static void uploadFile(String url, File file, String fileName,Map<String,String> params) {        //创建OkHttpClient请求对象        OkHttpClient okHttpClient = getInstance();        MultipartBody.Builder builder = new MultipartBody.Builder();        builder.setType(MultipartBody.FORM);        //参数        if (params != null){            for (String key : params.keySet()){                builder.addFormDataPart(key,params.get(key));            }        }        //文件...参数name指的是请求路径中所接受的参数...如果路径接收参数键值是fileeeee,此处应该改变        builder.addFormDataPart("file",fileName,RequestBody.create(MediaType.parse("application/octet-stream"),file));        //构建        MultipartBody multipartBody = builder.build();        //创建Request        Request request = new Request.Builder().url(url).post(multipartBody).build();        //得到Call        Call call = okHttpClient.newCall(request);        //执行请求        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                //上传成功回调 目前不需要处理                if (response.isSuccessful()){                    String s = response.body().string();                    com.orhanobut.logger.Logger.e("上传--"+s);                }            }        });    }    /**     * Post请求发送JSON数据....{"name":"zhangsan","pwd":"123456"}     * 参数一:请求Url     * 参数二:请求的JSON     * 参数三:请求回调     */    public static void doPostJson(String url, String jsonParams, Callback callback) {        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonParams);        Request request = new Request.Builder().url(url).post(requestBody).build();        Call call = getInstance().newCall(request);        call.enqueue(callback);    }    /**     * 下载文件 以流的形式把apk写入的指定文件 得到file后进行安装     * 参数er:请求Url     * 参数san:保存文件的文件夹....download     */    public static void download(final Activity context, final String url, final String saveDir) {        Request request = new Request.Builder().url(url).build();        Call call = getInstance().newCall(request);        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                com.orhanobut.logger.Logger.e(e.getLocalizedMessage());            }            @Override            public void onResponse(Call call, final Response response) throws IOException {                InputStream is = null;                byte[] buf = new byte[2048];                int len = 0;                FileOutputStream fos = null;                try {                    is = response.body().byteStream();//以字节流的形式拿回响应实体内容                    //apk保存路径                    final String fileDir = isExistDir(saveDir);                    //文件                    File file = new File(fileDir, getNameFromUrl(url));                    fos = new FileOutputStream(file);                    while ((len = is.read(buf)) != -1) {                        fos.write(buf, 0, len);                    }                    fos.flush();                    context.runOnUiThread(new Runnable() {                        @Override                        public void run() {                            Toast.makeText(context, "下载成功:" + fileDir + "," + getNameFromUrl(url), Toast.LENGTH_SHORT).show();                        }                    });                    //apk下载完成后 调用系统的安装方法                    Intent intent = new Intent(Intent.ACTION_VIEW);                    intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");                    context.startActivity(intent);                } catch (IOException e) {                    e.printStackTrace();                } finally {                    if (is != null) is.close();                    if (fos != null) fos.close();                }            }        });    }    /**     * 判断下载目录是否存在......并返回绝对路径     *     * @param saveDir     * @return     * @throws IOException     */    public static String isExistDir(String saveDir) throws IOException {        // 下载位置        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {            File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir);            if (!downloadFile.mkdirs()) {                downloadFile.createNewFile();            }            String savePath = downloadFile.getAbsolutePath();            Log.e("savePath", savePath);            return savePath;        }        return null;    }    /**     * @param url     * @return 从下载连接中解析出文件名     */    private static String getNameFromUrl(String url) {        return url.substring(url.lastIndexOf("/") + 1);    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 娱乐之太帅了怎么办 鞋舌头歪没有孔怎么办 万一吃了母猪肉怎么办 我的手机丢了怎么办 欠了赌债还不起怎么办 车库门前被堵了怎么办 别人车停我车位怎么办 怎么办能防止锁眼被堵 别人堵着我车了怎么办 马桶被排骨堵了怎么办 马桶被刷子堵了怎么办 屎太大马桶堵了怎么办 大便硬马桶堵了怎么办 马桶让大便堵了怎么办 出了月子奶水少怎么办 木瓜没熟切开了怎么办 小孩被蚊虫叮咬红肿怎么办 下巴歪导致脸歪怎么办 全民k歌有杂音怎么办 录歌换气声很大怎么办 网易云没有的歌怎么办 qq空间给封了怎么办 酒店住最后一间怎么办 妻子起诉离婚丈夫不离怎么办 老婆对我没感情怎么办 老婆要跟我离婚怎么办 眼睛里进了沙子怎么办 耳塞孔进沙子了怎么办 斜挎包链子长了怎么办 爱上大15岁大叔怎么办 老板不给发工资怎么办 4个月婴儿感冒了怎么办 9个月宝宝感冒了怎么办 婆婆去世了我该怎么办 腰疼得睡不着觉怎么办 长期抱孩子腰疼怎么办 抱孩子累的腰疼怎么办 带孩子带的腰疼怎么办 生完孩子后便秘怎么办 生完宝宝下面松怎么办 坐完月子后腰疼怎么办