美文网首页
OkHttp3详解

OkHttp3详解

作者: kjy_112233 | 来源:发表于2018-09-21 20:34 被阅读0次

    一、OkHttp的封装

    (1)创建JSON回调

    public abstract class NetworkCallback implements Callback {
    
    
        public abstract void onError(Call call, String e);
    
        public abstract void onResponse(JSONObject response, int id);
    
        @Override
        public void onFailure(@NonNull Call call, @NonNull IOException e) {
            onError(call, e.toString());
        }
    
        @Override
        public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
            assert response.body() != null;
            final String response_body = response.body().string();
            try {
                JSONObject jsonObject = new JSONObject(response_body);
                onResponse(jsonObject, response.code());
            } catch (JSONException e) {
                onError(call, e.toString());
            }
        }
    }
    

    (2)创建下载文件回调

    public abstract class NetworkCallbackFile implements Callback {
    
        private String destFileDir;
        private String destFileName;
    
        public NetworkCallbackFile(String destFileDir, String destFileName) {
            this.destFileDir = destFileDir;
            this.destFileName = destFileName;
        }
    
        public abstract void onError(Call call, String e);
    
        public abstract void onResponse(File response, int id);
    
        @Override
        public void onFailure(@NonNull Call call, @NonNull IOException e) {
            onError(call, e.toString());
        }
    
        @Override
        public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
            onResponse(saveFile(response), response.code());
        }
    
        public File saveFile(Response response) throws IOException {
            InputStream is = null;
            byte[] buf = new byte[2048];
            int len;
            FileOutputStream fos = null;
            try {
                assert response.body() != null;
                is = response.body().byteStream();
                File dir = new File(destFileDir);
                if (!dir.exists()) {
                    dir.mkdirs();
                }
                File file = new File(dir, destFileName);
                fos = new FileOutputStream(file);
                while ((len = is.read(buf)) != -1) {
                    fos.write(buf, 0, len);
                }
                fos.flush();
                return file;
    
            } finally {
                try {
                    assert response.body() != null;
                    response.body().close();
                    if (is != null) is.close();
                } catch (IOException ignored) {
                }
                try {
                    if (fos != null) fos.close();
                } catch (IOException ignored) {
                }
    
            }
        }
    }
    

    (3)网络请求封装

    public class OkHttpUtils {
        private OkHttpClient client;
        private static OkHttpUtils instance;
        private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    
        public OkHttpUtils() {
            client = new OkHttpClient();
        }
    
        public static OkHttpUtils get() {
            if (instance == null) {
                instance = new OkHttpUtils();
            }
            return instance;
        }
    
        public void post(final String url, String token, final Map<String, String> params, final NetworkCallback callback) {
            post(null, url, token, params, callback);
        }
    
        public void post(Context context, final String url, String token, final Map<String, String> params, final NetworkCallback callback) {
            FormBody.Builder builder = new FormBody.Builder();
            if (params != null && params.size() > 0) {
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    builder.add(entry.getKey(), entry.getValue());
                }
            }
            Request request;
            //发起request
            if (context == null) {
                request = new Request.Builder()
                        .url(url)
                        .addHeader("token", token)
                        .post(builder.build())
                        .build();
            } else {
                request = new Request.Builder()
                        .url(url)
                        .addHeader("token", token)
                        .post(builder.build())
                        .tag(context)
                        .build();
            }
            client.newCall(request).enqueue(callback);
        }
    
        public void get(final String url, String token, final Map<String, String> params, final NetworkCallback callback) {
            get(null, url, token, params, callback);
        }
    
        public void get(Context context, final String url, String token, final Map<String, String> params, final NetworkCallback callback) {
            //拼接url
            StringBuilder get_url = new StringBuilder(url);
            if (params != null && params.size() > 0) {
                int i = 0;
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    if (i++ == 0) {
                        get_url.append("?").append(entry.getKey()).append("=").append(entry.getValue());
                    } else {
                        get_url.append("&").append(entry.getKey()).append("=").append(entry.getValue());
                    }
                }
            }
            Request request;
            //发起request
            if (context == null) {
                request = new Request.Builder()
                        .url(url)
                        .addHeader("token", token)
                        .build();
            } else {
                request = new Request.Builder()
                        .url(url)
                        .addHeader("token", token)
                        .tag(context)
                        .build();
            }
            client.newCall(request).enqueue(callback);
        }
    
        public void uploadFiles(String url, Map<String, File> files, final NetworkCallback callback) {
            uploadFiles(null, url, null, files, callback);
        }
    
        public void uploadFiles(String url, Map<String, String> params, Map<String, File> files, final NetworkCallback callback) {
            uploadFiles(null, url, params, files, callback);
        }
    
        public void uploadFiles(Context context, String url, Map<String, File> files, final NetworkCallback callback) {
            uploadFiles(context, url, null, files, callback);
        }
    
        public void uploadFiles(Context context, String url, Map<String, String> params, Map<String, File> files, final NetworkCallback callback) {
            MultipartBody.Builder multipartBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
    
            //添加参数
            if (params != null && !params.isEmpty()) {
                for (String key : params.keySet()) {
                    multipartBuilder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + key + "\""),
                            RequestBody.create(null, Objects.requireNonNull(params.get(key))));
                }
            }
    
            //添加上传文件
            if (files != null && !files.isEmpty()) {
                RequestBody fileBody;
                for (String key : files.keySet()) {
                    File file = files.get(key);
                    assert file != null;
                    String fileName = file.getName();
                    fileBody = RequestBody.create(MediaType.parse(guessMimeType(fileName)), file);
                    multipartBuilder.addPart(
                            Headers.of("Content-Disposition", "form-data; name=\"" + key + "\"; filename=\"" + fileName + "\""),
                            fileBody);
                }
            }
    
            Request request;
            if (context == null) {
                request = new Request.Builder()
                        .url(url)
                        .post(multipartBuilder.build())
                        .build();
            } else {
                request = new Request.Builder()
                        .url(url)
                        .post(multipartBuilder.build())
                        .tag(context)
                        .build();
            }
            client.newCall(request).enqueue(callback);
        }
    
        public void downloadFiles(String url, final NetworkCallbackFile callback) {
            downloadFiles(null, url, callback);
        }
    
        public void downloadFiles(Context context, String url, final NetworkCallbackFile callback) {
            Request request;
            if (context == null) {
                request = new Request.Builder()
                        .url(url)
                        .build();
            } else {
                request = new Request.Builder()
                        .url(url)
                        .tag(context)
                        .build();
            }
            client.newCall(request).enqueue(callback);
        }
    
        public void cancel(Context context) {
            if (client != null) {
                for (Call call : client.dispatcher().queuedCalls()) {
                    if (Objects.equals(call.request().tag(), context))
                        call.cancel();
                }
                for (Call call : client.dispatcher().runningCalls()) {
                    if (Objects.equals(call.request().tag(), context))
                        call.cancel();
                }
            }
        }
    
        private String guessMimeType(String path) {
            FileNameMap fileNameMap = URLConnection.getFileNameMap();
            String contentTypeFor = null;
            try {
                contentTypeFor = fileNameMap.getContentTypeFor(URLEncoder.encode(path, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            if (contentTypeFor == null) {
                contentTypeFor = "application/octet-stream";
            }
            return contentTypeFor;
        }
    }
    

    OkHttp3源码详解

    相关文章

      网友评论

          本文标题:OkHttp3详解

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