初识OkHttp | 青训营笔记

169 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第1天。

什么是OkHttp

Android网络请求框架之OkHttp,一个处理网络请求的开源框架,是安卓端最火热的轻量级框架,用于替代HttpUrlConnection和Apache HttpClient。

之前个人也写过一篇使用HttpUrlConnection进行网络请求的博客(Android网络通信)。

image.png

请求流程

       1:首先生成一个OkHttpClient对象

       2:用键值对来包装我们的Request请求

       3:将请求加入队列生成一个Call管理请求

       4:若是同步请求直接执行调用excute方法等待处理返回Response,若为异步则实现Callback回调,在onResponse里获取Response参数

代码实现

1. 修改权限

首先还是修改配置文件,并添加网络权限

AndroidManifest.xml

为程序添加网络权限: <uses-permission android:name="android.permission.INTERNET"/>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="bytedance.example.easy_tiktok">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

2. 功能模块

public class MyOkHttp {
    OkHttpClient client;    //OkHttpClient对象
    String url;         //目标网络地址
    Request request;    //请求
    Response response;  //响应
    Call call;
不发送POST请求的构造函数
    public MyOkHttp(String url) {
        this.url = url;             //设置目标网络地址

//        创建OKHttpClient类的实例
        client = new OkHttpClient();

//        创建request对象(并设置目标地址、请求方式等)
        request = new Request.Builder()
                .url(url)           //设置目标网络地址
                .get()              //默认为get请求
                .build();

//        调用newCall()方法创建call对象
        call = client.newCall(request);
    }

发送POST请求的构造函数
    public MyOkHttp(String url, RequestBody requestBody) {
        this.url = url;

//        创建OKHttpClient类的实例
        client = new OkHttpClient();

//        创建request对象(并设置目标地址、请求方式等)
        request = new Request.Builder()
                .url(url)           //设置目标网络地址
                .post(requestBody)  //为post请求设置请求体
                .build();

//        调用newCall()方法创建call对象
        call = client.newCall(request);
    }

同步请求

执行请求的操作是阻塞式,直到HTTP响应返回。

如果当前OkHttpClient已经执行了一个同步任务,如果这个任务没有释放锁,那么新发起的请求将被阻塞,直到当前任务释放锁。

同步请求对应OkHttp中的execute()方法。

因为同步请求的方式会阻塞调用线程,所以提交同步请求的操作应放在子线程中执行,否则有可能会引起ANR异常,并且在Android 3.0以后已经不允许在主线程中进行网络操作了。

    public void postRequest(){
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                try {
//                    response = call.execute();
//                    String responseData = response.body().string();
//                    Log.d(TAG, "run: "+responseData);
//                }catch (IOException e){
//                    e.printStackTrace();
//                }
//            }
//        });

异步请求

执行的是非阻塞式请求,它的执行结果一般都是通过接口回调的方式告知调用者。

同一时刻可以发起多个请求,因为异步请求每一个都是在一个独立的线程,由线程队列管理。

异步请求对应OkHttp中的enqueue()方法。

通过Call对象的enqueue(Callback)方法来提交异步请求,异步发起的请求会被加入到队列中通过线程池来执行。

最后通过接口回调的onResponse()方法来接收服务器返回的数据。

        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                Log.d(TAG, "onFailure: ");
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                String responseData = response.body().string();
                Log.d(TAG, "run: "+responseData);
            }
        });
    }

}