Android:OkHttp同步请求和异步请求

一、前言

网络请求之前工作中用到的是post请求,然后了解之后发现请求的种类还有很多种。下面着重讲到是get和post的同步请求和异步请求。

二、具体内容

1.Okhttp的特点:

  • 支持Http/2并允许对同一主机的所有请求共享一套接字;
  • 如果非HTTP/2,则通过连接池,减少了请求延迟;
  • 默认请求GZip压缩数据;
  • 响应缓存,避免了重复请求网络;

2.get的同步请求

需要用到的测试网址:

https://httpbin.org

测试代码如下:

public class OkhttpTestActivity extends AppCompatActivity {

    private OkHttpClient okHttpClient;//新建okHttp请求器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp_test);
        okHttpClient = new OkHttpClient();
    }
    public void getSync(View view){//get同步请求
        /**
         * 括号里是请求的域名以及需要上传的参数
         * 如果需要上传参数只需要在请求域名后面加一个?a=1&b=2
         */

        new Thread(){
            @Override
            public void run() {
                Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();
                //一个准备好请求的call对象
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    System.out.println(response.body().string());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                super.run();
            }

        }.start();


    }
}

运行结果截图

使用get同步请求时遇到的问题如下

之前写代码是这样的

 public void getSync(View view){//get同步请求
        /**
         * 括号里是请求的域名以及需要上传的参数
         * 如果需要上传参数只需要在请求域名后面加一个?a=1&b=2
         */

        new Thread(){
            @Override
            public void run() {
                Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();
                //一个准备好请求的call对象
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    System.out.println(response.body().toString());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                super.run();
            }

        }.start();

在获取请求体的时候用response.body().toString();报错如下

修改方案:

   public void getSync(View view){//get同步请求
        /**
         * 括号里是请求的域名以及需要上传的参数
         * 如果需要上传参数只需要在请求域名后面加一个?a=1&b=2
         */

        new Thread(){
            @Override
            public void run() {
                Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();
                //一个准备好请求的call对象
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    System.out.println(response.body().string());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                super.run();
            }

        }.start();


    }

把请求体改成response.body().string()就好了

总结:同步请求要等call.execute执行完成之后再执行接下去的代码

3.get的异步请求

知识点补充:

  1.异步请求和同步请求的区别时异步请求调用的是enqueue方法。然后传递一个回调对象给              enqueue方法,需要用到callback方法中的两个接口回调。callback中有两个接口需要实现,一        个是请求失败的回调接口另一个是请求结束的回调接口
  2.需要注意的的是请求码是200成功404失败,无论是200~299还是404都会调用结束的接口所以       当调用onResponse接口时也不意味者接口调用成功了
  3.当调用response只意味着我们跟服务器之间的通信是成功的,处理数据不一定成功。
  4.200~300之间代表成功300~400代表重定向400~~500代表服务器错误

public class OkhttpTestActivity extends AppCompatActivity {

    private OkHttpClient okHttpClient;//新建okHttp请求器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp_test);
        okHttpClient = new OkHttpClient();
    }


    public void getAync(View view) {//get异步请求
        Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();
        //一个准备好请求的call对象
        Call call = okHttpClient.newCall(request);
        //异步请求和同步请求的区别时异步请求调用的是enqueue方法然后传递一个回调对象给enqueue方法,callback中有两个接口需要实现,一个是请求失败的回调接口另一个是请求结束的回调接口
        //需要注意的的是请求码是200成功404失败,无论是200~299还是404都会调用结束的接口所以当调用onResponse接口时也不意味者接口调用成功了
        //当response出现200是只意味着我们跟服务器之间的通信是成功的,处理数据不一定成功
        //200~300之间代表成功300~400代表重定向400~~500代表服务器错误
        call.enqueue(new Callback() {
            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                if (response.isSuccessful()) {
                    System.out.println(response.body().string());
                }
            }

            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {

            }

        });

    }
}

运行结果

总结:异步请求不会等服务器请求完成之后再去执行后面的代码enqueue内部就会帮我们创建子线程我们不需要自己再创建子线程。 

4.post同步请求

注意点:OkHttp默认创建出来的request是get请求

get请求和post请求的区别:get请求需要加在url的后面,然而post请求需要把请求参数放在请求体里面

测试代码:

public class OkhttpTestActivity extends AppCompatActivity {

    private OkHttpClient okHttpClient;//新建okHttp请求器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp_test);
        okHttpClient = new OkHttpClient();
    }

    public void postSync(View view) {//post同步请求
        FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
        Request request = new Request.Builder().url("https://httpbin.org/post").post(formBody).build();
        new Thread(){
            @Override
            public void run() {
                //一个准备好请求的call对象
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    System.out.println(response.body().string());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                super.run();
            }
        }.start();
    }
}

测试结果:

5.post异步请求

测试代码

public class OkhttpTestActivity extends AppCompatActivity {

    private OkHttpClient okHttpClient;//新建okHttp请求器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp_test);
        okHttpClient = new OkHttpClient();
    }

    public void postAync(View view) {//post异步请求
        FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
        Request request = new Request.Builder().url("https://httpbin.org/post").post(formBody).build();
        //一个准备好请求的call对象
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {

            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                System.out.println(response.body().string());

            }
        });
    }

}

测试结果

6.测试请求的页面布局

我在一个页面上放置了四个按钮代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ui.study.OkhttpTestActivity">
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="getSync"
        android:text="GET同步请求"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="getAync"
        android:text="GET异步请求"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="postSync"
        android:text="POST同步请求"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="postAync"
        android:text="POST异步请求"/>

</LinearLayout>

总结:post请求和get请求参数位置不同post要放到FormBody里面其他的相差不大,最后希望可以帮到你。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/126201.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运维相关(一) - Vue项目配置WebSocket连接{ws、wss 连接方式}

Vue项目配置WebSocket连接 ws、wss 两种方式 1. 写作背景2. 晒出代码2.1 前端 vue.config.js 的代码2.2 Vue项目路由配置代码3.3 服务器Nginx配置 3. 使用方式3.1 前端代码3.2 后端代码 4. 测试使用 1. 写作背景 项目使用的是ruoyi的前后端分离框架项目需要使用到 websocket , …

数据结构与算法—双链表

前言 前面有很详细的讲过线性表(顺序表和链表)&#xff0c;当时讲的链表以单链表为主&#xff0c;但在实际应用中双链表有很多应用场景&#xff0c;例如大家熟知的LinkedList。 双链表与单链表区别 单链表和双链表都是线性表的链式实现&#xff0c;它们的主要区别在于节点结构…

lua 时间差功能概略

简介 在进行程序设计过程中&#xff0c;经常需要对某些函数、某些程序片断从开始运行到运行结束所耗费的时间进行一些量化。这种量化实际上就是计算时间差。 获取函数耗时情景如下&#xff1a; function time_used() --开始计时-- do something at here. --结束计时--时间差&…

交易所开发搭建

在当今的数字货币市场中&#xff0c;交易所开发搭建已经成为了一个重要的领域。交易所是数字货币交易的主要场所&#xff0c;为投资者提供了安全、可靠、高效的交易服本务文。将详细介绍交易所开发搭建的整个流程&#xff0c;包括需求分析、设计、技术选型、开发、测试和上线等…

【2】Spring Boot 3 项目搭建

目录 【2】Spring Boot 3 初始项目搭建项目生成1. 使用IDEA商业版创建2. 使用官方start脚手架创建 配置与启动Git版本控制 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; 【2】Spring Boot 3 初始项目搭建 项目生成 1. 使用IDEA商业版创…

【Element】隐藏 el-table 展开行的箭头

需求 点击行展开行&#xff0c;隐藏箭头 方法 首先需求是点击行显示展开行 row-click"rowClick"const rowClick (row: any, column: any, event: any) > {console.log(row, column, event)if (multipleTable.value) {multipleTable.value.toggleRowExpansio…

PostgreSQL 技术内幕(十一)位图扫描

扫描算子在上层计算和底层存储之间&#xff0c;向下扫描底层存储的数据&#xff0c;向上作为计算的输入源&#xff0c;在SQL的执行层中&#xff0c;起着关键的作用。顺序、索引、位图等不同类型的扫描算子适配不同的数据分布场景。然而&#xff0c;扫描算子背后的实现原理是怎样…

投资自己,成就未来——人大女王金融硕士助力您成为金融领域的佼佼者

在这个日新月异的时代&#xff0c;金融行业的发展日益繁荣&#xff0c;对于金融人才的需求也越来越大。为了应对这一挑战&#xff0c;越来越多的人选择投身金融领域&#xff0c;提升自己的专业素养。而中国人民大学女王金融硕士项目&#xff0c;正是为了满足这一需求而设立的&a…

JVM在线分析-解决问题的工具一(jinfo,jmap,jstack)

1. jinfo (base) PS C:\Users\zishi\Desktop> jinfo Usage:jinfo <option> <pid>(to connect to a running process)where <option> is one of:-flag <name> to print the value of the named VM flag #输出对应名称的参数-flag [|-]<n…

Pandas数据预处理Pandas合并数据集在线闯关_头歌实践教学平台

Pandas数据预处理合并数据集 第1关 Concat与Append操作第2关 合并与连接第3关 案例&#xff1a;美国各州的统计数据 第1关 Concat与Append操作 任务描述 本关任务&#xff1a;使用read_csv()读取两个csv文件中的数据&#xff0c;将两个数据集合并&#xff0c;将索引设为Ladder…

element ui:常用的组件使用情况记录

前言 将element ui使用过程中一些常用的组件使用情况记录如下 组件 el-tree树组件 树父子节点成一列显示 没有进行设置之前显示效果 设置之后显示效果 ​​​​ 主要代码如下 <el-treeicon-class"none"expand-on-click-node"false"style"…

震裕科技-300953 三季报分析(20231108)

震裕科技-300953 基本情况 公司名称&#xff1a;宁波震裕科技股份有限公司 A股简称&#xff1a;震裕科技 成立日期&#xff1a;1994-10-18 上市日期&#xff1a;2021-03-18 所属行业&#xff1a;专用设备制造业 周期性&#xff1a;0 主营业务&#xff1a;精密级进冲压模具及下游…

Word通过Adobe打印PDF时总是报错,打开记事本

Word文档打印&#xff0c;选择Adobe作为打印机&#xff0c;打印过程中总是报错&#xff0c;不断打开记事本&#xff0c;提示打印出错&#xff0c;错误信息如下&#xff1a; %%[ ProductName: Distiller ]%% %%[Page: 1]%% %%[Page: 2]%% %%[ Error: invalidfont; OffendingCom…

Scala中编写多线程爬虫程序并做可视化处理

在Scala中编写一个爬虫程序来爬取店铺商品并进行可视化处理&#xff0c;需要使用Selenium和Jsoup库来操作网页。在这个例子中&#xff0c;我们将使用多线程来提高爬取速度。 1、首先&#xff0c;我们需要引入所需的库&#xff1a; import org.openqa.selenium.By import org.o…

【Unity之UI编程】在Unity中如何打图集,来降低DrowCall

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;UI_…

Mysql 不同存储引擎数据文件的形式详解

目录 MyISAM MERGE InnoDB Memory Archive CSV BLACKHOLE MySQL 中的每一个数据表在磁盘上至少被表示为一个文件&#xff0c;即存放着该数据表结构定义的 .frm 文件。不同的存储引擎还有其它用来存放数据和索引信息的文件。 从 MySQL 8.0 版本开始&#xff0c;frm 表结构…

[HCTF 2018]WarmUp全网最详细解释

查看源码找到提示 访问source.php 代码审计&#xff1a; class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php"]; 定义了一个名为emmm的类&#xff0c;在该类中有…

Linux之IPC通信共享内存与消息队列、管道、信号量、socket内存拷贝实例总结(六十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

射频功率放大器应用中GaN HEMT的表面电势模型

标题&#xff1a;A surface-potential based model for GaN HEMTs in RF power amplifier applications 来源&#xff1a;IEEE IEDM 2010 本文中的任何第一人称都为论文的直译 摘要&#xff1a;我们提出了第一个基于表面电位的射频GaN HEMTs紧凑模型&#xff0c;并将我们的工…