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的同步与异步请求的主要内容,如果未能解决你的问题,请参考以下文章
OkHttpOkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )
OkHttpOkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )