Android okhttp的同步与异步请求

Posted 森然献凉i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android okhttp的同步与异步请求相关的知识,希望对你有一定的参考价值。

说明:对okhttp简单使用

布局文件

activity.mian.xml

<?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=".MainActivity">
    <Button
        android:text="同步GET"
        android:onClick="getSync"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:text="异步GET"
        android:onClick="getAsync"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:text="同步POST"
        android:onClick="postSync"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:text="异步POST"
        android:onClick="postAsync"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

注:使用的测试地址为 www.httpbin.org

GET

参数由url后面添加问号方式上传,如 https://www.httpbin.org/get?a=1&b=2"

同步GET请求

需要开启线程,否则将会阻塞

  //同步get请求
    public void getSync(View view) {
        //开启线程,否则程序会阻塞在execute
        new Thread(){
            @Override
            public void run() {
                //Request封装请求地址,参数
                Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
                //准备好请求的call对象
                Call call=okHttpClient.newCall(request);
                try {
                    //进行同步请求
                    Response response = call.execute();
                    Log.i(TAG, "getSync: "+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

异步GET请求

 //异步get请求
    public void getAsync(View view) {
        //Request封装请求地址,参数
        Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
        //准备好请求的call对象
        Call call=okHttpClient.newCall(request);

        //异步get请求
        call.enqueue(new Callback() {
            //请求失败
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }
            //请求结束
            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                // 如果请求成功:get() = code in 200..299
                if (response.isSuccessful()){
                    Log.i(TAG, "getASync: "+response.body().string());
                }


            }
        });
    }

POST

差异:post请求的数据使用FormBody提交

同步POST请求

同样需要开启线程

  //同步post请求
    public void postSync(View view) {
        new Thread(){
            @Override
            public void run() {
                //post使用FormBody提交参数
                FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
                //Request封装请求地址,参数
                Request request = new Request.Builder().url("https://www.httpbin.org/post")
                        .post(formBody)
                        .build();
                //准备好请求的call对象
                Call call=okHttpClient.newCall(request);
                try {
                    //进行同步请求
                    Response response = call.execute();
                    Log.i(TAG, "postSync: "+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();

    }

异步POST请求

    //异步post请求
    public void postAsync(View view) {
        //post使用FormBody提交参数
        FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
        //Request封装请求地址,参数
        Request request = new Request.Builder().url("https://www.httpbin.org/post")
                .post(formBody)
                .build();
        //准备好请求的call对象
        Call call=okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                if (response.isSuccessful()){
                    Log.i(TAG, "postAsync: "+response.body().string());
                }


            }
        });
    }

结束

以上是关于Android okhttp的同步与异步请求的主要内容,如果未能解决你的问题,请参考以下文章

Android okhttp的同步与异步请求

Android:OkHttp同步和异步请求流程的理解和使用

OkHttpOkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )

OkHttpOkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )

OKHttp源码解析

OkHttp 在 Android 中怎么发送异步请求