广告
返回顶部
首页 > 资讯 > 移动开发 >Android内置的OkHttp用法介绍
  • 577
分享到

Android内置的OkHttp用法介绍

AndroidOkHttpAndroidOkHttp使用 2022-11-13 14:11:42 577人浏览 薄情痞子
摘要

目录1.异步GET请求2.异步POST请求3.异步上传文件4.异步下载文件5.异步上传Multipart文件6.设置超时时间和缓存OkHttp 处理了很多网络疑难杂症,比如从很多常用

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android内置的OkHttp用法介绍

本文链接: https://www.lsjlt.com/news/171544.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android内置的OkHttp用法介绍
    目录1.异步GET请求2.异步POST请求3.异步上传文件4.异步下载文件5.异步上传Multipart文件6.设置超时时间和缓存Okhttp 处理了很多网络疑难杂症,比如从很多常用...
    99+
    2022-11-13
    Android OkHttp Android OkHttp使用
  • Android内置SQLite的使用详细介绍
    目录一、创建数据库  1、新建数据库帮助类2、在数据库帮助类中输入代码3、代码讲解  二、添加数据1、界面效果2、准备工作3、布局界面 activity_main...
    99+
    2022-11-13
  • android CursorLoader用法介绍
    工作内容集中到Contact模块,这个应用查询数据的地方很多,其使用了CursorLoader这个工具大大简化了代码复杂度。android自3.0提供了Loader机制,当时g...
    99+
    2022-06-06
    Android
  • PHP5.4内置Web服务器的用法介绍
    本篇内容主要讲解“PHP5.4内置Web服务器的用法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP5.4内置Web服务器的用法介绍”吧!PHP是一种脚本语言,它需要PHP解释器来分析运...
    99+
    2023-06-17
  • python内置函数语法介绍
    本篇内容介绍了“python内置函数语法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一 前言   在编写Pytho...
    99+
    2023-06-04
  • android startActivityForResult的使用方法介绍
    Activity 跳转 都知道用startActivity(Intent)但是如果下面情况呢?Activity1 跳转到 Activity2  但是还需要在Activ...
    99+
    2022-06-06
    方法 Android
  • Golang内置函数使用方法详细介绍
    Golang是一种非常强大的编程语言,其提供许多内置函数以方便开发者进行编程。在本文中,我们将详细介绍Golang内置函数的使用方法,以供开发者参考。make函数make函数主要用于创建一个数据类型的对象(slice、map或channel...
    99+
    2023-05-16
    Golang(Go语言) 内置函数(built-in functions) 使用方法(usage methods)
  • Android 中LayoutInflater.inflate()方法的介绍
    Android 中LayoutInflater.inflate()方法的介绍最近一直想弄明白LayoutInflater对象的inflate方法的用法,今天做了实例。<LinearLayout android:id="@+id...
    99+
    2023-05-30
    android layoutinflater flat
  • JavaScript中的内置对象介绍
    一、对象的概念 对象是一种特殊的数据类型(object)。拥有一系列的属性和方法。分为内置对象和自定义对象。 二、String对象 String对象用来支持对于字符串的处理。 1、属...
    99+
    2022-11-13
  • javascript中内置对象Math的介绍及用法案例
    目录前言Math概述Math中常用函数的用法1.绝对值方法2.三个取整方法3.求最大值/最小值4.随机数结语前言 今天总结一下javascript 内置对象Math中的函数用法,顺带...
    99+
    2022-11-13
  • Android ADB详细介绍及用法
    Android ADB 用法 adb  全称是 Android Debug Bridge, 就是起到调试桥的作用。 用来操作android设备的 阅读目录 ad...
    99+
    2022-06-06
    adb Android
  • android之HttpPostHttpGet使用方法介绍
    直接讲用法,先知道怎么用,再知道怎么回事 1、HttpPost 代码如下: try{ //创建连接 HttpClient httpClient = new DefaultHt...
    99+
    2022-06-06
    方法 Android
  • Python 内置logging 使用详细介绍
    目录logging 的主要作用logging 日志等级logging 的基础函数logging 的四大组件(类)logging 的配置logging 和 print 的区别主要参考资...
    99+
    2022-11-11
  • Android Map新用法:MapFragment应用介绍
    1.MapView ,MapActivity 这种的局限在于,必须要继承MapActivity,否则无法使用MapView。纠结就在于此。但是,最新官网上已经弃用了这糟粕的Ma...
    99+
    2022-06-06
    map Android
  • Java中的方法内联介绍
    目录1. 什么是方法内联2. 方法内联的重要性3. Java中方法内联的困难继承类型关系分析 CHA总结 1. 什么是方法内联 例如有下面的原始代码: static cla...
    99+
    2022-11-13
  • C#中内联函数的用法介绍
    C++ 中有个内联函数,使用 inline 来修饰函数,编译器就会对其进行优化,将此函数作为代码判断插入到调用处。 函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还...
    99+
    2022-11-13
  • Android手机使用Fiddler方法介绍
    Fiddler是一款免费的抓包、调试工具,比Wireshark要小巧,更简洁,本节就来介绍如何通过WIFI来抓取Android手机的HTTP和HTTPS包。 一、连接Andr...
    99+
    2022-06-06
    fiddler Android
  • Android popupwindow简单使用方法介绍
    先看下效果 1.首页 package com.yskj.jh.demopopupwindow; import android.content.Context; impo...
    99+
    2022-06-06
    方法 popupwindow Android
  • Android数据库greenDAO配置与使用介绍
    目录build.gradle配置数据库初始化添加数据删除数据修改数据查询数据补充结束不知不觉发现都快一个月没有写点东西了,自己最近也是忙于工作与生活当中,这个月经历了很多事情,有开心...
    99+
    2023-03-12
    Android数据库greenDAO Android greenDAO
  • Android中dumpsys命令用法简单介绍
    在Android手机上, 通过使用adb shell命令可以进入android系统的shell, 该shell除支持一些常用的标准命令之外,还支持一些和android系统相关的...
    99+
    2022-06-06
    Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作