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里面其他的相差不大,最后希望可以帮到你。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用OkHttp进行同步请求的代码中,首先需要创建一个OkHttpClient对象。然后,通过构建Request对象指定请求的URL和其他参数。接下来,使用OkHttpClient的newCall()方法创建一个Call对象,并将Request对象作为参数传入。然后,调用Call对象的execute()方法来发送请求并获取服务器的响应。最后,通过response.body().string()方法来获取服务器返回的字符串数据。在代码中,这些步骤都是在子线程中完成的,因为同步请求会阻塞主线程的执行。需要注意的是,网络请求必须在子线程中完成,以避免阻塞主线程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [AndroidOkhttp同步请求异步请求详解](https://blog.csdn.net/lu202032/article/details/117375167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [AndroidOkhttp3详解(get和post同步异步文件上传)](https://blog.csdn.net/Karl_MIN/article/details/123513993)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值