• 安卓okhttp网络请求封装使用


    直接上代码

    首先导入okhttop和Gson

    1. implementation 'com.squareup.okhttp3:okhttp:3.9.0'
    2. implementation 'com.google.code.gson:gson:2.10.1'

    添加权限

    1. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    2. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    4. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    5. <uses-permission android:name="android.permission.INTERNET"/>

    下面是网络请求工具类封装

    1. import android.app.ProgressDialog;
    2. import android.content.Context;
    3. import android.os.Handler;
    4. import android.os.Looper;
    5. import androidx.annotation.NonNull;
    6. import java.io.IOException;
    7. import java.util.Map;
    8. import java.util.Objects;
    9. import java.util.concurrent.TimeUnit;
    10. import okhttp3.Call;
    11. import okhttp3.Callback;
    12. import okhttp3.FormBody;
    13. import okhttp3.OkHttpClient;
    14. import okhttp3.Request;
    15. import okhttp3.Response;
    16. public class OkhtttpUtils {
    17. private final Handler mHandler; // 主线程Handler
    18. private final OkHttpClient mOkHttpClient; // OkHttpClient实例
    19. private static OkhtttpUtils sOkhtttpUtils;
    20. private String mToken;
    21. private OkhtttpUtils() {
    22. mHandler = new Handler(Looper.getMainLooper());
    23. // 创建OkHttpClient实例
    24. mOkHttpClient = new OkHttpClient.Builder()
    25. .readTimeout(5000, TimeUnit.MILLISECONDS) // 设置读取超时时间
    26. .connectTimeout(5000, TimeUnit.MILLISECONDS) // 设置连接超时时间
    27. .writeTimeout(5000, TimeUnit.MILLISECONDS) // 设置写入超时时间
    28. .retryOnConnectionFailure(true) // 设置失败重试
    29. .build();
    30. }
    31. // 获取单例实例
    32. public static OkhtttpUtils getInstance() {
    33. if (sOkhtttpUtils == null) {
    34. synchronized (OkhtttpUtils.class) {
    35. if (sOkhtttpUtils == null) {
    36. sOkhtttpUtils = new OkhtttpUtils();
    37. }
    38. }
    39. }
    40. return sOkhtttpUtils;
    41. }
    42. // 设置token
    43. public void setToken(String token) {
    44. mToken = token;
    45. }
    46. // 清除token
    47. public void clearToken() {
    48. mToken = null;
    49. }
    50. // 更新token
    51. public void updateToken(String newToken) {
    52. mToken = newToken;
    53. }
    54. // 自定义回调接口
    55. public interface OkCallback {
    56. void onFailure(Exception e); // 请求失败回调
    57. void onResponse(String json); // 请求成功回调
    58. }
    59. // 发起Get请求
    60. public void doGet(Context context,String url, Map params, final OkCallback ycfOkCallback) {
    61. // 显示数据加载中
    62. showLoadingDialog(context);
    63. if (params != null && !params.isEmpty()) {
    64. StringBuilder urlBuilder = new StringBuilder(url);
    65. if (!url.contains("?")) {
    66. urlBuilder.append("?");
    67. } else {
    68. urlBuilder.append("&");
    69. }
    70. for (Map.Entry entry : params.entrySet()) {
    71. urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
    72. }
    73. url = urlBuilder.toString();
    74. }
    75. Request.Builder requestBuilder = new Request.Builder()
    76. .get()
    77. .url(url);
    78. // 判断是否设置了token,如果设置了,则添加到请求头中
    79. if (mToken != null) {
    80. requestBuilder.addHeader("Authorization", mToken);
    81. }
    82. Request request = requestBuilder.build();
    83. Call call = mOkHttpClient.newCall(request);
    84. call.enqueue(new Callback() {
    85. @Override
    86. public void onFailure(@NonNull Call call, final IOException e) {
    87. // 加载失败
    88. dismissLoadingDialog(context);
    89. if (ycfOkCallback != null) {
    90. mHandler.post(() -> ycfOkCallback.onFailure(e));
    91. }
    92. }
    93. @Override
    94. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
    95. dismissLoadingDialog(context);
    96. if (response.isSuccessful()) {
    97. final String json = Objects.requireNonNull(response.body()).string();
    98. if (ycfOkCallback != null) {
    99. mHandler.post(() -> ycfOkCallback.onResponse(json));
    100. }
    101. } else {
    102. // 加载失败
    103. if (ycfOkCallback != null) {
    104. mHandler.post(() -> ycfOkCallback.onFailure(new IOException("Response unsuccessful")));
    105. }
    106. }
    107. }
    108. });
    109. }
    110. private ProgressDialog progressDialog;
    111. private void showLoadingDialog(Context context) {
    112. progressDialog = new ProgressDialog(context);
    113. progressDialog.setMessage("数据加载中...");
    114. progressDialog.setCancelable(false);
    115. progressDialog.show();
    116. }
    117. /**
    118. * 隐藏加载对话框(带参数Context)
    119. * @param context 上下文环境
    120. */
    121. private void dismissLoadingDialog(Context context) {
    122. if (progressDialog != null && progressDialog.isShowing()) {
    123. progressDialog.dismiss();
    124. }
    125. }
    126. /**
    127. * 隐藏加载对话框(无参数)
    128. */
    129. private void dismissLoadingDialog() {
    130. if (progressDialog != null && progressDialog.isShowing()) {
    131. progressDialog.dismiss();
    132. }
    133. }
    134. // 发起Post请求
    135. public void doPost( Context context,String url, Map params, final OkCallback ycfOkCallback) {
    136. // 显示数据加载中
    137. showLoadingDialog(context);
    138. FormBody.Builder builder = new FormBody.Builder();
    139. if (params != null && !params.isEmpty()) {
    140. for (Map.Entry entry : params.entrySet()) {
    141. builder.add(entry.getKey(), Objects.requireNonNull(entry.getValue()));
    142. }
    143. }
    144. FormBody formBody = builder.build();
    145. Request.Builder requestBuilder = new Request.Builder()
    146. .post(formBody)
    147. .url(url);
    148. // 判断是否设置了token,如果设置了,则添加到请求头中
    149. if (mToken != null) {
    150. requestBuilder.addHeader("Authorization", mToken);
    151. }
    152. Request request = requestBuilder.build();
    153. Call call = mOkHttpClient.newCall(request);
    154. call.enqueue(new Callback() {
    155. @Override
    156. public void onFailure(@NonNull Call call, final IOException e) {
    157. dismissLoadingDialog(context);
    158. if (ycfOkCallback != null) {
    159. mHandler.post(() -> ycfOkCallback.onFailure(e));
    160. }
    161. }
    162. @Override
    163. public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
    164. dismissLoadingDialog(context);
    165. if (response.isSuccessful()) {
    166. final String json = Objects.requireNonNull(response.body()).string();
    167. if (ycfOkCallback != null) {
    168. mHandler.post(() -> ycfOkCallback.onResponse(json));
    169. }
    170. } else {
    171. if (ycfOkCallback != null) {
    172. mHandler.post(() -> ycfOkCallback.onFailure(new IOException("Response unsuccessful")));
    173. }
    174. }
    175. }
    176. });
    177. }
    178. }

    调用方式

    1. import androidx.appcompat.app.AppCompatActivity;
    2. import android.os.Bundle;
    3. import android.util.Log;
    4. import android.widget.TextView;
    5. import com.google.gson.Gson;
    6. import java.util.HashMap;
    7. import java.util.Map;
    8. import okhttp3.FormBody;
    9. import okhttp3.MediaType;
    10. import okhttp3.RequestBody;
    11. public class MainActivity extends AppCompatActivity {
    12. private TextView text;
    13. @Override
    14. protected void onCreate(Bundle savedInstanceState) {
    15. super.onCreate(savedInstanceState);
    16. setContentView(R.layout.activity_main);
    17. text=findViewById(R.id.text);
    18. //get请求
    19. // Map params = new HashMap<>();
    20. // OkhtttpUtils.getInstance().doGet(this, "https://ku.qingnian8.com/dataApi/news/navlist.php", params, new OkhtttpUtils.OkCallback() {
    21. // @Override
    22. // public void onFailure(Exception e) {
    23. // Log.d("get请求失败数据", e.getMessage());
    24. // text.setText( "get请求失败数据"+e.getMessage());
    25. // }
    26. //
    27. // @Override
    28. // public void onResponse(String json) {
    29. // Log.d("get请求成功数据", json);
    30. // text.setText( json);
    31. // }
    32. // });
    33. OkhtttpUtils.getInstance().setToken("3A6943C3B865FA2B2C825CDCB33C5304");//设置token
    34. OkhtttpUtils.getInstance().clearToken();//清空
    35. OkhtttpUtils.getInstance().updateToken("3A6943C3B865FA2B2C825CDCB33C5304");//更新oken
    36. //post请求
    37. Map postParams = new HashMap<>();
    38. postParams.put("order_number", "3A6943C3B865FA2B2C825CDCB33C5304");
    39. OkhtttpUtils.getInstance().doPost(this, "https://api-hmugo-web.itheima.net/api/public/v1/my/orders/req_unifiedorder", postParams, new OkhtttpUtils.OkCallback() {
    40. @Override
    41. public void onFailure(Exception e) {
    42. Log.d("post请求失败数据", e.getMessage());
    43. text.setText( "post请求失败数据"+e.getMessage());
    44. }
    45. @Override
    46. public void onResponse(String json) {
    47. Log.d("post请求成功数据", json);
    48. text.setText( json);
    49. }
    50. });
    51. }
    52. }

    布局代码

    1. "1.0" encoding="utf-8"?>
    2. <androidx.constraintlayout.widget.ConstraintLayout 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. tools:context=".MainActivity">
    8. <TextView
    9. android:id="@+id/text"
    10. android:layout_width="wrap_content"
    11. android:layout_height="wrap_content"
    12. android:text="Hello World!"
    13. app:layout_constraintBottom_toBottomOf="parent"
    14. app:layout_constraintEnd_toEndOf="parent"
    15. app:layout_constraintStart_toStartOf="parent"
    16. app:layout_constraintTop_toTopOf="parent" />
    17. androidx.constraintlayout.widget.ConstraintLayout>

    注意这点不要忘记添加 网络安全配置   ,这段配置的作用是允许应用中的明文流量,并指定了信任锚点的证书来

    然后,在应用的清单文件(AndroidManifest.xml)中的 标签内添加以下代码,引用刚刚创建的网络安全配置文件:

    1. <application
    2. ...
    3. android:networkSecurityConfig="@xml/network_security_config"
    4. ...>
    5. ...
    6. application>

    network_security_config.xml

    1. <network-security-config>
    2. <base-config cleartextTrafficPermitted="true">
    3. <trust-anchors>
    4. <certificates src="system" />
    5. <certificates src="user" />
    6. trust-anchors>
    7. base-config>
    8. network-security-config>

    至此就是安卓okhttp网络请求封装及使用

  • 相关阅读:
    售后服务管理系统(Java+Web+J2EE+MySQL)
    低代码如何赋能实体经济走向数实融合
    奇数位丢弃(C++、Python)
    Spring扩展接口(4):InstantiationAwareBeanPostProcessor
    有趣的23000----整理(10)G词根
    Ci2451-2.4g无线MCU收发芯片
    OpenTracing总结
    vue2和vue3的区别
    Navicat 查询创建工具 | 设置分组准则 - Part 5
    【动态规划——子序列】
  • 原文地址:https://blog.csdn.net/qq_41733851/article/details/136453017