Android内置的OkHttp用法介绍

作者:m0_63970488 时间:2021-11-29 01:00:53 

Okhttp 处理了很多网络疑难杂症,比如从很多常用的连接问题中自动恢复。如果你服务器配置了多个IP地址,当一个IP地址连接失败后Okhttp会自动尝试下一个IP,从Android4.4版本后,系统内置了Okhttp,可见Okhttp功能的强大。

远程依赖添加,okio作为Okhttp的IO组件,也是必须要引入的。

    api 'com.squareup.okhttp3:okhttp:3.12.13'
    api 'com.squareup.okio:okio:2.8.0'

1.异步GET请求

Request.Builder url = new Request.Builder().url("");
       url.method("GET", null);
       Request build = url.build();
       OkHttpClient okHttpClient = new OkHttpClient();
       Call call = okHttpClient.newCall(build);
       call.enqueue(new Callback() {
           @Override
           public void onFailure(Call call, IOException e) {
           }
           @Override
           public void onResponse(Call call, Response response) throws IOException {
               String string = response.body().string();
           }
       });

其基本步骤就是创建OkhttpClient、Request、和Call,最后调用Call的enqueue方法,需要注意的是onResponse回调并非在UI线程中,如果想要同步GET请求,则可以调用Call的execute方法。

2.异步POST请求

Okhttp3的异步POST请求和okhttp2的异步POST请求有一些差别,就是没有FormEncodingBuilder这个类,替代它的是功能强大的FormBody。

RequestBody formBody = new FormBody.Builder()
               .add("ip", "59.108.54.37")
               .build();
       Request build = new Request.Builder()
               .url("")
               .post(formBody)
               .build();
       OkHttpClient okHttpClient = new OkHttpClient();
       Call call = okHttpClient.newCall(build);
       call.enqueue(new Callback() {
           @Override
           public void onFailure(Call call, IOException e) {
           }
           @Override
           public void onResponse(Call call, Response response) throws IOException {
           }
       });

这与异步GET请求类似,只是多了FormBody来封装请求参数,并传递给Request

3.异步上传文件

上传文件本身也是一个POST请求,首先定义上传的文件类型。

public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");

在SD卡的根目录创建一个文件 ,里面内容为OkHttp

String filePath = "";
       if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
           filePath = Environment.getExternalStorageDirectory().getAbsolutePath();
       } else {
           return;
       }
       File file = new File(filePath, "test.txt");
       Request build = new Request.Builder()
               .url("")
               .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
               .build();
       OkHttpClient okHttpClient = new OkHttpClient();
       okHttpClient.newCall(build).enqueue(new Callback() {
           @Override
           public void onFailure(Call call, IOException e) {
           }
           @Override
           public void onResponse(Call call, Response response) throws IOException {
           }
       });

如果想要改为同步上传文件,只要调用OkhttpClient.newCall(request).execute()就可以了,最终请求返回结构就是我们txt文件中的内容。

4.异步下载文件

下载一张图片,得到Respouse后流写进我们指定的图片文件中,代码如下所示

String url = "";
       Request request = new Request.Builder().url(url).build();
       OkHttpClient okHttpClient = new OkHttpClient();
       okHttpClient.newCall(request).enqueue(new Callback() {
           @Override
           public void onFailure(Call call, IOException e) {
           }
           @Override
           public void onResponse(Call call, Response response) throws IOException {
               InputStream inputStream = response.body().byteStream();
               FileOutputStream fileOutputStream = null;
               String filePath = "";
               try {
                   if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                       filePath = Environment.getExternalStorageDirectory().getAbsolutePath();
                   } else {
                       filePath = getFilesDir().getAbsolutePath();
                   }
                   File file = new File(filePath, "test.jpg");
                   if (null != file) {
                       fileOutputStream = new FileOutputStream(file);
                       byte[] buffer = new byte[2048];
                       int len = 0;
                       while ((len = inputStream.read(buffer)) != -1) {
                           fileOutputStream.write(buffer, 0, len);
                       }
                       fileOutputStream.flush();
                   }
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }
       });

5.异步上传Multipart文件

有时上传文件时,同时还需要上传其他类型的字段。 Okhttp3 实现起来很简单。 需要注意的是没有服务器接受我这个Multipart文件,具体应用还要结合实际工作中对应的服务器

private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
   public static void send() {
       OkHttpClient okHttpClient = new OkHttpClient();
       MultipartBody build = new MultipartBody.Builder()
               .setType(MultipartBody.FORM)
               .addFormDataPart("title", "test") //1
               .addFormDataPart("image", "test.jpg", RequestBody.create(MEDIA_TYPE_PNG, new File("/sdcard/test.jpg")))//2
               .build();
       Request authorization = new Request.Builder()
               .header("Authorization", "Client-ID" + "...")
               .url("")
               .post(build)
               .build();
       okHttpClient.newCall(authorization).enqueue(new Callback() {
           @Override
           public void onFailure(Call call, IOException e) {
           }
           @Override
           public void onResponse(Call call, Response response) throws IOException {
           }
       });
   }

上述代码中,注释1处是常见的 key-value(键-值)形式的参数。

注释2处则是上传表单,addFormDataPart方法的第一个参数是key值,第二个参数是上传文件的名字,第三个参数是需要上传的文件。

6.设置超时时间和缓存

和Okhttp2有区别的是Okhttp3不能通过OkhttpClient直接设置超时时间和缓存了,而是通过OkHttpClient.Builder来设置。通过OkHttpClient.Builder配置好OkHttpClient后用builder.build()返回OkHttpClient。我们通常不会调用 new OkhttpClient() 来得到OkhttpClient,而是通过builder.build()得到OkHttpClient。另外OkHttp3支持设置连接,写入和读取超时时间。

File sdcache = new File("");
       int cacheSize = 10 * 1024 * 1024;
       OkHttpClient.Builder builder = new OkHttpClient.Builder()
               .connectTimeout(15, TimeUnit.SECONDS)
               .writeTimeout(20, TimeUnit.SECONDS)
               .readTimeout(20, TimeUnit.SECONDS)
               .cache(new Cache(sdcache.getAbsoluteFile(),cacheSize));
       OkHttpClient okHttpClient = builder.build();

来源:https://blog.csdn.net/m0_63970488/article/details/125938410

标签:Android,OkHttp
0
投稿

猜你喜欢

  • Java多种经典排序算法(含动态图)

    2023-09-24 00:45:02
  • Jenkins的安装配置详解

    2023-08-27 11:31:42
  • Android 中Notification弹出通知实现代码

    2021-05-31 14:48:18
  • Spring boot热部署devtools过程解析

    2022-06-21 13:12:09
  • Mybatis Lombok使用方法与复杂查询介绍

    2023-03-30 00:30:13
  • Java基础教程之组合(composition)

    2022-08-02 19:12:32
  • Java设计模式之命令模式

    2022-06-17 22:49:07
  • Android实现自定义圆形进度条

    2022-10-28 04:55:22
  • c# webapi 配置swagger的方法

    2022-03-21 23:38:19
  • android实现图片裁剪的两种方法

    2022-10-27 18:41:05
  • Android实现语音合成与识别功能

    2023-10-01 01:41:00
  • Flutter Zone异常处理方法及基本原理

    2021-11-25 23:30:30
  • Android 关闭多个Activity的实现方法

    2022-02-24 21:21:19
  • 浅谈C#中Md5和Sha1两种加密方式

    2023-04-01 20:25:11
  • Java中如何动态创建接口的实现方法

    2023-11-25 15:13:02
  • Android启动屏实现左右滑动切换查看功能

    2022-11-02 02:18:02
  • 举例讲解Java的Hibernate框架中的多对一和一对多映射

    2023-09-05 23:05:53
  • Android so的热升级尝试

    2023-08-07 22:41:59
  • c# 成员类型访问权限低于字段本身的实现

    2021-12-23 07:08:27
  • Mybatis plus中的like查询问题

    2022-03-18 09:14:30
  • asp之家 软件编程 m.aspxhome.com