Android内置的OkHttp用法介绍

目录
  • 1.异步GET请求
  • 2.异步POST请求
  • 3.异步上传文件
  • 4.异步下载文件
  • 5.异步上传Multipart文件
  • 6.设置超时时间和缓存

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();

到此这篇关于Android内置的OkHttp用法介绍的文章就介绍到这了,更多相关Android OkHttp内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android okhttp的启动流程及源码解析

    前言 这篇文章主要讲解了okhttp的主要工作流程以及源码的解析. 什么是OKhttp 简单来说 OkHttp 就是一个客户端用来发送 HTTP 消息并对服务器的响应做出处理的应用层框架. 那么它有什么优点呢? 易使用.易扩展. 支持 HTTP/2 协议,允许对同一主机的所有请求共用同一个 socket 连接. 如果 HTTP/2 不可用, 使用连接池复用减少请求延迟. 支持 GZIP,减小了下载大小. 支持缓存处理,可以避免重复请求. 如果你的服务有多个 IP 地址,当第一次连接失败,OkHt

  • Android 网络请求框架解析之okhttp与okio

    安卓网络请求 先看一下今天的大纲 导入okhttp和okio依赖 禁用掉明文流量请求的检查 添加访问权限 布局及代码实现 运行结果 下面是具体步骤 一.导入okhttp和okio的依赖 1.打开File-Project Structure-Dependencies, 2.选择自己的程序文件,点击加号,选择Library Dependency 3.搜索okhttp,选择Com.squareup.okhttp3,点击ok按钮,此时可能需要较长时间 4.okio同上 5.应用,确认 6.此时我们可以看

  • Android Okhttp断点续传面试深入解析

    前言 我们在刷一下面试题的时候,有时候会看到一些大厂会问关于断点续传的原理,那么今天在这里从 HTTP 断点续传知识和 Android 中如何实现断点续传的思路来做一个关于 Android 断点续传原理的总结. Http 断点续传知识点 什么是断点续传 指的是在上传/下载时,将任务(一个文件或压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经上传/下载的部分开始继续上传/下载未完成的部分,而没有必要从头开始上传/下载.可以节省时间,提高速度. Htt

  • Android OKHttp使用简介

    下面是官网给出的OKHTTP的特点: 支持HTTP/2, HTTP/2通过使用多路复用技术在一个单独的TCP连接上支持并发, 通过在一个连接上一次性发送多个请求来发送或接收数据: 如果HTTP/2不可用, 连接池复用技术也可以极大减少延时: 透明的Gzip处理降低了通信数据的大小 响应缓存完全避免了网络中的重复请求 使用Okio来简化数据的访问与存储,提高性能 如果您的服务器配置了多个IP地址, 当第一个IP连接失败的时候, OkHttp会自动尝试下一个IP OkHttp还处理了代理服务器问题和

  • Android使用OkHttp发送post请求

    本文实例为大家分享了使用OkHttp发送post请求的具体代码,供大家参考,具体内容如下 MainActivity.java public class MainActivity extends AppCompatActivity { private EditText mEt_qq; private EditText mEt_pwd; private TextView mTv_status; String path = "http://169.254.53.96:8080/web/LoginSer

  • 解析Android框架之OkHttp3源码

    OkHttp流程图 OkHttp基本使用 gradle依赖 implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation 'com.squareup.okio:okio:1.15.0' /** *这里拿get请求来 * 异步的get请求 */ public void okhttpAsyn() { //设置超时的时间 OkHttpClient.Builder builder = new OkHttpClient.Builder

  • Android使用OKhttp3实现登录注册功能+springboot搭建后端的详细过程

    目录 一.Android前端实现 二.数据库 三.SpringBoot后端搭建 四.部署至服务器 五.运行测试 一.Android前端实现 新建一个login的项目,主要的几个文件在这里 1.gradle引入OKhttp3依赖 implementation 'com.squareup.okhttp3:okhttp:3.14.7' implementation 'com.squareup.okio:okio:1.17.5' 2.activity_main.xml布局文件 <?xml version

  • Android基于OkHttp实现下载和上传图片

    本文实例为大家分享了OkHttp实现下载图片和上传图片的具体代码,供大家参考,具体内容如下 MainActivity.java public class MainActivity extends AppCompatActivity { private String Path = "https://10.url.cn/eth/ajNVdqHZLLAxibwnrOxXSzIxA76ichutwMCcOpA45xjiapneMZsib7eY4wUxF6XDmL2FmZEVYsf86iaw/"

  • Android基于OkHttp实现文件上传功能

    本文实例为大家分享了Android基于OkHttp实现文件上传的具体代码,供大家参考,具体内容如下 一.相关概述 Android请求访问服务端大多数情况下依旧是使用http协议,故而可以参照web端的数据传输形式来实现. multipart/form-data是浏览器提交表单上传文件的一种方式. 有关于http的get,post请求大家可以自行百度了解. OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZI

  • Python内置函数reversed()用法分析

    本文实例讲述了Python内置函数reversed()用法.分享给大家供大家参考,具体如下: reversed()函数是返回序列seq的反向访问的迭代器.参数可以是列表,元组,字符串,不改变原对象. 1>参数是列表 >>> l=[1,2,3,4,5] >>> ll=reversed(l) >>> l [1, 2, 3, 4, 5] >>> ll <listreverseiterator object at 0x06A9E9

  • python 函数中的内置函数及用法详解

    今天来介绍一下Python解释器包含的一系列的内置函数,下面表格按字母顺序列出了内置函数: 下面就一一介绍一下内置函数的用法: 1.abs() 返回一个数值的绝对值,可以是整数或浮点数等. print(abs(-18)) print(abs(0.15)) result: 18 0.15 2.all(iterable) 如果iterable的所有元素不为0.''.False或者iterable为空,all(iterable)返回True,否则返回False. print(all(['a','b',

  • smarty内置函数config_load用法实例

    本文实例讲述了smarty内置函数config_load用法.分享给大家供大家参考.具体如下: {config_load}用于从配置文件中,加载到配置变量.详细用法如下: 配置文件:foo.conf 说明:[Table] 和 [Customer] 表示段落名称. 复制代码 代码如下: [Table] pageTitle = "this is mine" bodyBgColor = "#eee" tableBorderSize = 3 tableBgColor = &

  • smarty内置函数capture用法分析

    本文实例讲述了smarty内置函数capture用法.分享给大家供大家参考.具体分析如下: {capture}可以捕获标记范围内的输出内容,并存到变量中而不显示.有三种用法, 代码如下: 复制代码 代码如下: {capture name="banner"}aaaaaa{/capture} {$smarty.capture.banner} <hr /> {capture assign="foo"}bbbbbb{/capture} {$foo} <hr

  • smarty内置函数foreach用法实例

    本文实例讲述了smarty内置函数foreach用法.分享给大家供大家参考.具体如下: 输出文件:index.php 复制代码 代码如下: <?php require_once('libs/Smarty.class.php'); $smarty = new Smarty(); $smarty->setTemplateDir($_SERVER['DOCUMENT_ROOT']."/php/templates/"); $smarty->setCompileDir($_SE

  • Python内置函数的用法实例教程

    本文简单的分析了Python中常用的内置函数的用法,分享给大家供大家参考之用.具体分析如下: 一般来说,在Python中内置了很多有用的函数,我们可以直接调用. 而要调用一个函数,就需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档:http://docs.python.org/2/library/functions.html#abs 也可以在交互式命令行通过help(abs)查看abs函数的帮助信息. 调用abs函数: >>> a

  • Python3.5常见内置方法参数用法实例详解

    本文实例讲述了Python3.5常见内置方法参数用法.分享给大家供大家参考,具体如下: Python的内置方法参数详解网站为:https://docs.python.org/3/library/functions.html?highlight=built#ascii 1.abs(x):返回一个数字的绝对值.参数可以是整数或浮点数.如果参数是一个复数,则返回它的大小. #内置函数abs() print(abs(-2)) print(abs(4.5)) print(abs(0.1+7j)) 运行结果

  • python内置函数sorted()用法深入分析

    本文实例讲述了python内置函数sorted()用法.分享给大家供大家参考,具体如下: 列表对象提供了sort()方法支持原地排序,而内置函数sorted()不支持原地操作只是返回新的列表,并不对原列表进行任何修改.sorted()方法可以对列表.元组.字典.range对象等进行排序.列表的sort()方法和内置函数sorted()都支持key参数实现复杂排序要求. #使用key来指定排序依据,先按姓名升序排序,姓名相同的按年龄降序排序 >>> persons = [{'name':'

  • Python常见内置高效率函数用法示例

    本文实例讲述了Python常见内置高效率函数用法.分享给大家供大家参考,具体如下: 1.  filter(function,sequence) 将sequence中的每个元素,依次传进function函数(可以自定义,返回的结果是True或者False)筛选,返回符合条件的元素,重组成一个String,List,Tuple等(跟sequence一样) 示例 def func(x): return x%2==0 and x%3==0 filter(func,(3,6,8,12,15,21)) #(

  • python中字符串内置函数的用法总结

    capitalize() 首字母大写 a='someword' b=a.capitalize() print(b) ->Someword casefold()&lower() 所有字母变小写,casefold可将未知字符便小写 a='someWORD' b=a.casefold() print(b) c=a.lower() print(c) ->someword ->someword center(width,fillchar=None) 设置宽度,并将内容居中,空白未知填充,一

随机推荐

其他