Android OKhttp使用及原理

使用:

单利模式的

compile 'com.squareup.okhttp3:okhttp:3.8.1'

public class OkHttpUtil {
      //静态本类对象
          private static OkHttpUtil okHttpUtil;
          private OkHttpClient okHttpClient;
      
          //私有化构造方法
          private OkHttpUtil() {
              okHttpClient = new OkHttpClient.Builder().build();
          }
      
          //公共的供外部访问的方法
          public static OkHttpUtil getInstance() {
              if (okHttpUtil == null) {
                  synchronized (OkHttpUtil.class) {
                      if (okHttpUtil == null) {
                          okHttpUtil = new OkHttpUtil();
                      }
                  }
              }
              return okHttpUtil;
          }
      
          public void get(String url, Map<String, String> map, final NetworkCallback networkCallback) {
      
              if (map != null && map.size() > 0) {
      
                  StringBuffer sb = new StringBuffer(url);
                  sb.append("?");
                  Set<String> set = map.keySet();
                  for (String str : set) {
      
                      sb.append(str).append("=").append(map.get(str)).append("&");
                  }
                  url = sb.substring(0, sb.length() - 1);
              }
      
              Request request = new Request.Builder().url(url).build();
              okHttpClient.newCall(request).enqueue(new Callback() {
                  @Override
                  public void onFailure(Call call, IOException e) {
                      networkCallback.error(e.getMessage());
                  }
      
                  @Override
                  public void onResponse(Call call, Response response) throws IOException {
                      String string = response.body().string();
                      networkCallback.successful(string);
                  }
              });
          }
      
          public void post(String url, Map<String, String> map, final NetworkCallback networkCallback) {
              if (map != null && map.size() > 0) {
      
                  StringBuffer sb = new StringBuffer(url);
                  sb.append("?");
                  Set<String> set = map.keySet();
                  for (String str : set) {
      
                      sb.append(str).append("=").append(map.get(str)).append("&");
                  }
                  url = sb.substring(0, sb.length() - 1);
              }
      
              RequestBody body = new FormBody.Builder().build();
              Request request = new Request.Builder().url(url).method("POST", body).build();
              okHttpClient.newCall(request).enqueue(new Callback() {
                  @Override
                  public void onFailure(Call call, IOException e) {
                      networkCallback.error(e.getMessage());
                  }
      
                  @Override
                  public void onResponse(Call call, Response response) throws IOException {
                      String string = response.body().string();
                      networkCallback.successful(string);
                  }
              });
          }
}
 
 

文件上传

接下来我们在介绍一个可以构造RequestBody的生成器,叫做MultipartBuilder。当我们需要做类似于表单上传的时候,就可以使用它来构造我们的requestBody。

File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4");

RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);

RequestBody requestBody = new MultipartBuilder()
     .type(MultipartBuilder.FORM)
     .addPart(Headers.of(
          "Content-Disposition", 
              "form-data; name=\"username\""), 
          RequestBody.create(null, "张鸿洋"))
     .addPart(Headers.of(
         "Content-Disposition", 
         "form-data; name=\"mFile\"; 
         filename=\"wjd.mp4\""), fileBody)
     .build();

Request request = new Request.Builder()
    .url("http://192.168.1.103:8080/okHttpServer/fileUpload")
    .post(requestBody)
    .build();

Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback()
{
    //...
});
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

代码上述服务器向传递了一个键值对username:张鸿洋状语从句:一个文件。我们通过MultipartBuilder的addPart方法可以添加键值对或者文件。

其实类似于我们拼接模拟浏览器行为的方式,如果你对这块不懂,可以参考:从原理角度解析Android(Java)http文件上传

确定,对于我们最开始的目录还剩下图片下载,文件下载;这两个一个是通过回调的响应拿到字节[]然后解码成图片;文件下载,就是拿到的inputStream做写文件操作,我们这里就不赘述了。

关于用法,可以也。参考泡网OkHttp使用教程

接下来我们主要看如何封装上述的代码。


三,封装

由于按照上述的代码,写多个请求肯定包含大量的重复代码,所以我希望封装后的代码调用是这样的:

(一)使用

  1. 一般的GET请求

     OkHttpClientManager.getAsyn("https://www.baidu.com", new OkHttpClientManager.ResultCallback<String>()
            {
                @Override
                public void onError(Request request, Exception e)
                {
                    e.printStackTrace();
                }
    
                @Override
                public void onResponse(String u)
                {
                    mTv.setText(u);//注意这里是UI线程
                }
            });
 
 

猜你喜欢

转载自blog.csdn.net/yijiaodingqiankun/article/details/79234952