总体压缩包

NetworkDemo.zip

一、什么是OkHttp?

https://square.github.io/okhttp/

由Square公司贡献的一个处理网络请求的开源项目,是目前Android使用最广泛的网络框架。从Android4.4开始HttpURLConnection的底层实现采用的是OkHttp。

1.支持HTTP/2并允许对同一主机的所有请求共享一个套接字;

2.如果非HTTP/2,则通过连接池减少了请求延迟;

3.默认请求GZip压缩数据;

4.响应缓存,避免了重复请求的网络;

implementation(“com.squareup.okhttp3.okhttp:4.9.0”)

测试URL:https://www.httpbin.org/

二、OkHttp基本用法

OkHttpClient okHttpClient=new OkHttpClient ();

同步请求:

image.png

异步请求:

image.png

四、get同步请求的实现步骤

get同步实现的压缩包

  1. [NetworkDemo.zip](https://www.yuque.com/attachments/yuque/0/2021/zip/1574587/1624804724094-2216425d-d763-479a-b064-584bef2e29eb.zip?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fzip%2F1574587%2F1624804724094-2216425d-d763-479a-b064-584bef2e29eb.zip%22%2C%22name%22%3A%22NetworkDemo.zip%22%2C%22size%22%3A18085795%2C%22type%22%3A%22application%2Fx-zip-compressed%22%2C%22ext%22%3A%22zip%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22u72b7c640-af7a-4c48-8fee-dedfe03b23a%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22ub4354da2%22%2C%22card%22%3A%22file%22%7D)

1.添加依赖

image.png

2.在清单文件中添加权限

image.png

3.在布局中添加请求的按钮

image.png

4.实现按钮的方法

image.png

五、get同步请求的整体代码

1.布局activity_main.xml文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context=".MainActivity">
  9. <Button
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:onClick="getSync"
  13. android:text="get同步请求"
  14. android:textSize="30sp" />
  15. <Button
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:onClick="getASync"
  19. android:text="get异步请求"
  20. android:textSize="30sp" />
  21. <Button
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:onClick="postSync"
  25. android:text="post同步请求"
  26. android:textSize="30sp" />
  27. <Button
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:onClick="postASync"
  31. android:text="post异步请求"
  32. android:textSize="30sp" />
  33. </LinearLayout>

2.MainActivity

  1. package com.example.networkdemo;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.View;
  6. import java.io.IOException;
  7. import okhttp3.Call;
  8. import okhttp3.OkHttpClient;
  9. import okhttp3.Request;
  10. import okhttp3.Response;
  11. public class MainActivity extends AppCompatActivity {
  12. // 第一步,构建请求器
  13. private OkHttpClient okHttpClient;
  14. private static final String TAG="MainActivity";
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. okHttpClient = new OkHttpClient();
  20. }
  21. //get 同步请求
  22. public void getSync(View view) {
  23. // 第五步,创建一个子线程
  24. new Thread(){
  25. @Override
  26. public void run() {
  27. // 第二步,创建请求对象
  28. Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
  29. // 第三步,准备好请求的Call对象
  30. Call call = okHttpClient.newCall(request);
  31. try {
  32. // 第四步,请求得到的响应
  33. Response response = call.execute();
  34. Log.i(TAG,"getSync:"+response.body().string());
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }.start();
  40. }
  41. public void getASync(View view) {
  42. }
  43. public void postSync(View view) {
  44. }
  45. public void postASync(View view) {
  46. }
  47. }

3.效果图:

image.png

六、get异步请求的实现步骤

get异步实现的压缩包

  1. [NetworkDemo.zip](https://www.yuque.com/attachments/yuque/0/2021/zip/1574587/1624805661894-51e34b1e-3579-4261-9204-89fdf2a90917.zip?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fzip%2F1574587%2F1624805661894-51e34b1e-3579-4261-9204-89fdf2a90917.zip%22%2C%22name%22%3A%22NetworkDemo.zip%22%2C%22size%22%3A18105975%2C%22type%22%3A%22application%2Fx-zip-compressed%22%2C%22ext%22%3A%22zip%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22u76831c50-bb07-43ab-a562-aaf145d2c0b%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22uc3d1afd5%22%2C%22card%22%3A%22file%22%7D)

1.如上同get同步请求的前三个方法一致,调用enqueue实现异步请求

image.png

七、get异步请求的整体代码

1.MainActivity文件代码

  1. package com.example.networkdemo;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.View;
  6. import org.jetbrains.annotations.NotNull;
  7. import java.io.IOException;
  8. import okhttp3.Call;
  9. import okhttp3.Callback;
  10. import okhttp3.OkHttpClient;
  11. import okhttp3.Request;
  12. import okhttp3.Response;
  13. public class MainActivity extends AppCompatActivity {
  14. // 请求器
  15. private OkHttpClient okHttpClient;
  16. private static final String TAG="MainActivity";
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. okHttpClient = new OkHttpClient();
  22. }
  23. public void getSync(View view) {
  24. new Thread(){
  25. @Override
  26. public void run() {
  27. // 请求对象
  28. Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
  29. // 准备好请求的Call对象
  30. Call call = okHttpClient.newCall(request);
  31. try {
  32. // 请求得到的响应
  33. Response response = call.execute();
  34. Log.i(TAG,"getSync:"+response.body().string());
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }.start();
  40. }
  41. public void getASync(View view) {
  42. Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&a=2").build();
  43. // 准备好请求的Call对象
  44. Call call = okHttpClient.newCall(request);
  45. //异步请求
  46. call.enqueue(new Callback() {
  47. @Override
  48. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  49. }
  50. @Override
  51. public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
  52. if (response.isSuccessful()){
  53. Log.i(TAG,"getASync:"+response.body().string());
  54. }
  55. }
  56. });
  57. }
  58. public void postSync(View view) {
  59. }
  60. public void postASync(View view) {
  61. }
  62. }

2.效果图:

image.png

八、post同步请求与异步请求的实现步骤

1.post同步请求的实现

image.png

2.post异步请求的实现

image.png

九、整体代码

1.MainActivity文件整体代码

  1. package com.example.networkdemo;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.View;
  6. import org.jetbrains.annotations.NotNull;
  7. import java.io.IOException;
  8. import okhttp3.Call;
  9. import okhttp3.Callback;
  10. import okhttp3.FormBody;
  11. import okhttp3.OkHttpClient;
  12. import okhttp3.Request;
  13. import okhttp3.Response;
  14. public class MainActivity extends AppCompatActivity {
  15. // 请求器
  16. private OkHttpClient okHttpClient;
  17. private static final String TAG="MainActivity";
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. okHttpClient = new OkHttpClient();
  23. }
  24. public void getSync(View view) {
  25. new Thread(){
  26. @Override
  27. public void run() {
  28. // 请求对象
  29. Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
  30. // 准备好请求的Call对象
  31. Call call = okHttpClient.newCall(request);
  32. try {
  33. // 请求得到的响应
  34. Response response = call.execute();
  35. Log.i(TAG,"getSync:"+response.body().string());
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }.start();
  41. }
  42. public void getASync(View view) {
  43. Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&a=2").build();
  44. // 准备好请求的Call对象
  45. Call call = okHttpClient.newCall(request);
  46. //异步请求
  47. call.enqueue(new Callback() {
  48. @Override
  49. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  50. }
  51. @Override
  52. public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
  53. if (response.isSuccessful()){
  54. Log.i(TAG,"getASync:"+response.body().string());
  55. }
  56. }
  57. });
  58. }
  59. public void postSync(View view) {
  60. new Thread(){
  61. @Override
  62. public void run() {
  63. FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
  64. Request request = new Request.Builder()
  65. .url("https://www.httpbin.org/post").post(formBody).build();
  66. // 准备好请求的Call对象
  67. Call call = okHttpClient.newCall(request);
  68. try {
  69. // 请求得到的响应
  70. Response response = call.execute();
  71. Log.i(TAG,"postSync:"+response.body().string());
  72. } catch (IOException e) {
  73. e.printStackTrace();
  74. }
  75. }
  76. }.start();
  77. }
  78. public void postASync(View view) {
  79. FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
  80. Request request = new Request.Builder()
  81. .url("https://www.httpbin.org/post").post(formBody).build();
  82. // 准备好请求的Call对象
  83. Call call = okHttpClient.newCall(request);
  84. //异步请求
  85. call.enqueue(new Callback() {
  86. @Override
  87. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  88. }
  89. @Override
  90. public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
  91. if (response.isSuccessful()) {
  92. Log.i(TAG, "postASync:" + response.body().string());
  93. }
  94. }
  95. });
  96. }
  97. }

2.post同步请求效果图:

image.png

3.post异步请求效果图:

image.png