安卓okhttp网络请求封装使用

直接上代码

首先导入okhttop和Gson库

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

添加权限

    <!--允许应用程序改变网络状态-->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <!--允许应用程序改变WIFI连接状态-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <!--允许应用程序访问有关的网络信息-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!--允许应用程序访问WIFI网卡的网络信息-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <!--允许应用程序完全使用网络-->
    <uses-permission android:name="android.permission.INTERNET"/>

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



import android.app.ProgressDialog;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;

import androidx.annotation.NonNull;

import java.io.IOException;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkhtttpUtils {

    private final Handler mHandler; // 主线程Handler
    private final OkHttpClient mOkHttpClient; // OkHttpClient实例
    private static OkhtttpUtils sOkhtttpUtils;
    private String mToken;

    private OkhtttpUtils() {
        mHandler = new Handler(Looper.getMainLooper());

        // 创建OkHttpClient实例
        mOkHttpClient = new OkHttpClient.Builder()
                .readTimeout(5000, TimeUnit.MILLISECONDS) // 设置读取超时时间
                .connectTimeout(5000, TimeUnit.MILLISECONDS) // 设置连接超时时间
                .writeTimeout(5000, TimeUnit.MILLISECONDS) // 设置写入超时时间
                .retryOnConnectionFailure(true) // 设置失败重试
                .build();
    }

    // 获取单例实例
    public static OkhtttpUtils getInstance() {
        if (sOkhtttpUtils == null) {
            synchronized (OkhtttpUtils.class) {
                if (sOkhtttpUtils == null) {
                    sOkhtttpUtils = new OkhtttpUtils();
                }
            }
        }
        return sOkhtttpUtils;
    }

    // 设置token
    public void setToken(String token) {
        mToken = token;
    }
    // 清除token
    public void clearToken() {
        mToken = null;
    }

    // 更新token
    public void updateToken(String newToken) {
        mToken = newToken;
    }
    // 自定义回调接口
    public interface OkCallback {
        void onFailure(Exception e); // 请求失败回调

        void onResponse(String json); // 请求成功回调
    }

    // 发起Get请求
    public void doGet(Context context,String url, Map<String, String> params, final OkCallback ycfOkCallback) {
        // 显示数据加载中
        showLoadingDialog(context);

        if (params != null && !params.isEmpty()) {
            StringBuilder urlBuilder = new StringBuilder(url);
            if (!url.contains("?")) {
                urlBuilder.append("?");
            } else {
                urlBuilder.append("&");
            }
            for (Map.Entry<String, String> entry : params.entrySet()) {
                urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
            url = urlBuilder.toString();
        }

        Request.Builder requestBuilder = new Request.Builder()
                .get()
                .url(url);

        // 判断是否设置了token,如果设置了,则添加到请求头中
        if (mToken != null) {
            requestBuilder.addHeader("Authorization", mToken);
        }

        Request request = requestBuilder.build();

        Call call = mOkHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, final IOException e) {
                // 加载失败
                dismissLoadingDialog(context);
                if (ycfOkCallback != null) {
                    mHandler.post(() -> ycfOkCallback.onFailure(e));
                }
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                dismissLoadingDialog(context);
                if (response.isSuccessful()) {
                    final String json = Objects.requireNonNull(response.body()).string();
                    if (ycfOkCallback != null) {
                        mHandler.post(() -> ycfOkCallback.onResponse(json));
                    }
                } else {
                    // 加载失败
                    if (ycfOkCallback != null) {
                        mHandler.post(() -> ycfOkCallback.onFailure(new IOException("Response unsuccessful")));
                    }
                }
            }
        });
    }

    private ProgressDialog progressDialog;

    private void showLoadingDialog(Context context) {
        progressDialog = new ProgressDialog(context);
        progressDialog.setMessage("数据加载中...");
        progressDialog.setCancelable(false);
        progressDialog.show();
    }

    /**
     * 隐藏加载对话框(带参数Context)
     * @param context 上下文环境
     */
    private void dismissLoadingDialog(Context context) {
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    }

    /**
     * 隐藏加载对话框(无参数)
     */
    private void dismissLoadingDialog() {
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    }

    // 发起Post请求
    public void doPost( Context context,String url, Map<String, String> params, final OkCallback ycfOkCallback) {
        // 显示数据加载中
        showLoadingDialog(context);

        FormBody.Builder builder = new FormBody.Builder();
        if (params != null && !params.isEmpty()) {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                builder.add(entry.getKey(), Objects.requireNonNull(entry.getValue()));
            }
        }
        FormBody formBody = builder.build();

        Request.Builder requestBuilder = new Request.Builder()
                .post(formBody)
                .url(url);

        // 判断是否设置了token,如果设置了,则添加到请求头中
        if (mToken != null) {
            requestBuilder.addHeader("Authorization", mToken);
        }

        Request request = requestBuilder.build();

        Call call = mOkHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, final IOException e) {
                dismissLoadingDialog(context);
                if (ycfOkCallback != null) {
                    mHandler.post(() -> ycfOkCallback.onFailure(e));
                }
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                dismissLoadingDialog(context);
                if (response.isSuccessful()) {
                    final String json = Objects.requireNonNull(response.body()).string();
                    if (ycfOkCallback != null) {
                        mHandler.post(() -> ycfOkCallback.onResponse(json));
                    }
                } else {
                    if (ycfOkCallback != null) {
                        mHandler.post(() -> ycfOkCallback.onFailure(new IOException("Response unsuccessful")));
                    }
                }
            }
        });
    }
}

调用方式


import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import com.google.gson.Gson;

import java.util.HashMap;
import java.util.Map;

import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.RequestBody;

public class MainActivity extends AppCompatActivity {

    private TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text=findViewById(R.id.text);

//get请求

//        Map<String, String> params = new HashMap<>();
//        OkhtttpUtils.getInstance().doGet(this, "https://ku.qingnian8.com/dataApi/news/navlist.php", params, new OkhtttpUtils.OkCallback() {
//            @Override
//            public void onFailure(Exception e) {
//                Log.d("get请求失败数据", e.getMessage());
//                text.setText( "get请求失败数据"+e.getMessage());
//            }
//
//            @Override
//            public void onResponse(String json) {
//                Log.d("get请求成功数据", json);
//                text.setText( json);
//            }
//        });


        OkhtttpUtils.getInstance().setToken("3A6943C3B865FA2B2C825CDCB33C5304");//设置token
        OkhtttpUtils.getInstance().clearToken();//清空
        OkhtttpUtils.getInstance().updateToken("3A6943C3B865FA2B2C825CDCB33C5304");//更新oken
        
       //post请求 
        
        Map<String, String> postParams = new HashMap<>();
        postParams.put("order_number", "3A6943C3B865FA2B2C825CDCB33C5304");
        OkhtttpUtils.getInstance().doPost(this, "https://api-hmugo-web.itheima.net/api/public/v1/my/orders/req_unifiedorder", postParams, new OkhtttpUtils.OkCallback() {
            @Override
            public void onFailure(Exception e) {
                Log.d("post请求失败数据", e.getMessage());
                text.setText( "post请求失败数据"+e.getMessage());
            }

            @Override
            public void onResponse(String json) {
                Log.d("post请求成功数据", json);
                text.setText( json);
            }
        });

    }
}

布局代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

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

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

<application
    ...
    android:networkSecurityConfig="@xml/network_security_config"
    ...>
    ...
</application>

network_security_config.xml

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>

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

  • 29
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OkHttp 是一款非常优秀的网络请求框架,可以用来实现 Android 应用中的网络请求。如果要封装一个网络工具类,可以考虑以下几个步骤: 1. 引入 OkHttp 库。可以通过在 build.gradle 文件中添加以下依赖来引入 OkHttp 库: ``` implementation 'com.squareup.okhttp3:okhttp:4.9.0' ``` 2. 创建一个单例类来管理 OkHttp。在这个类中,我们可以创建一个 OkHttpClient 对象,用于发送网络请求。同时,可以在这个类中定义一些公共的请求参数、头部信息等,以便在发送网络请求使用。 ```java public class HttpUtils { private static HttpUtils mInstance; private OkHttpClient mOkHttpClient; private HttpUtils() { mOkHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build(); } public static HttpUtils getInstance() { if (mInstance == null) { synchronized (HttpUtils.class) { if (mInstance == null) { mInstance = new HttpUtils(); } } } return mInstance; } public OkHttpClient getOkHttpClient() { return mOkHttpClient; } } ``` 3. 封装网络请求。在发送网络请求时,我们可以使用 OkHttp 提供的 Request 和 Response 类来实现。可以考虑封装一个方法,传入请求参数和回调函数,来发送网络请求,并将结果返回给回调函数。 ```java public void sendRequest(Request request, Callback callback) { mOkHttpClient.newCall(request).enqueue(callback); } ``` 4. 在回调函数中处理请求结果。在发送网络请求时,我们可以通过传入回调函数的方式,来处理请求结果。在回调函数中,可以根据请求结果的状态码、响应体等信息,来处理请求结果。 ```java public abstract class HttpCallback implements Callback { @Override public void onFailure(Call call, IOException e) { // 网络请求失败 } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { // 网络请求成功,处理响应结果 String result = response.body().string(); onSuccess(result); } else { // 网络请求失败 onFailure(response.code(), response.message()); } } public abstract void onSuccess(String result); public abstract void onFailure(int code, String message); } ``` 5. 封装常用的网络请求方法。根据业务需求,可以封装一些常用的网络请求方法,例如 GET、POST 等请求方法,以便在发送网络请求使用。 ```java public void doGet(String url, HttpCallback callback) { Request request = new Request.Builder().url(url).build(); sendRequest(request, callback); } public void doPost(String url, RequestBody body, HttpCallback callback) { Request request = new Request.Builder().url(url).post(body).build(); sendRequest(request, callback); } ``` 通过以上步骤,我们可以封装一个简单的 OkHttp 网络工具类,用于发送网络请求。当然,具体的实现还需要根据业务需求进行调整和优化,以上仅供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来之梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值