Android:OkHttp同步请求和异步请求
一、前言
网络请求之前工作中用到的是post请求,然后了解之后发现请求的种类还有很多种。下面着重讲到是get和post的同步请求和异步请求。
二、具体内容
1.Okhttp的特点:
- 支持Http/2并允许对同一主机的所有请求共享一套接字;
- 如果非HTTP/2,则通过连接池,减少了请求延迟;
- 默认请求GZip压缩数据;
- 响应缓存,避免了重复请求网络;
2.get的同步请求
需要用到的测试网址:
测试代码如下:
public class OkhttpTestActivity extends AppCompatActivity {private OkHttpClient okHttpClient;//新建okHttp请求器@Overrideprotected 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(){@Overridepublic void run() {Request request = new Request.Builder().url("=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(){@Overridepublic void run() {Request request = new Request.Builder().url("=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(){@Overridepublic void run() {Request request = new Request.Builder().url("=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请求器@Overrideprotected 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("=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() {@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {if (response.isSuccessful()) {System.out.println(response.body().string());}}@Overridepublic 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请求器@Overrideprotected 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("").post(formBody).build();new Thread(){@Overridepublic 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请求器@Overrideprotected 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("").post(formBody).build();//一个准备好请求的call对象Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {}@Overridepublic 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=""xmlns:app=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".ui.study.OkhttpTestActivity"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="getSync"android:text="GET同步请求"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="getAync"android:text="GET异步请求"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="postSync"android:text="POST同步请求"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="postAync"android:text="POST异步请求"/></LinearLayout>
总结:post请求和get请求参数位置不同post要放到FormBody里面其他的相差不大,最后希望可以帮到你。
Android:OkHttp同步请求和异步请求
一、前言
网络请求之前工作中用到的是post请求,然后了解之后发现请求的种类还有很多种。下面着重讲到是get和post的同步请求和异步请求。
二、具体内容
1.Okhttp的特点:
- 支持Http/2并允许对同一主机的所有请求共享一套接字;
- 如果非HTTP/2,则通过连接池,减少了请求延迟;
- 默认请求GZip压缩数据;
- 响应缓存,避免了重复请求网络;
2.get的同步请求
需要用到的测试网址:
测试代码如下:
public class OkhttpTestActivity extends AppCompatActivity {private OkHttpClient okHttpClient;//新建okHttp请求器@Overrideprotected 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(){@Overridepublic void run() {Request request = new Request.Builder().url("=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(){@Overridepublic void run() {Request request = new Request.Builder().url("=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(){@Overridepublic void run() {Request request = new Request.Builder().url("=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请求器@Overrideprotected 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("=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() {@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {if (response.isSuccessful()) {System.out.println(response.body().string());}}@Overridepublic 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请求器@Overrideprotected 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("").post(formBody).build();new Thread(){@Overridepublic 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请求器@Overrideprotected 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("").post(formBody).build();//一个准备好请求的call对象Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {}@Overridepublic 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=""xmlns:app=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".ui.study.OkhttpTestActivity"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="getSync"android:text="GET同步请求"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="getAync"android:text="GET异步请求"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="postSync"android:text="POST同步请求"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="postAync"android:text="POST异步请求"/></LinearLayout>
总结:post请求和get请求参数位置不同post要放到FormBody里面其他的相差不大,最后希望可以帮到你。