You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio(Java)中如何实现无网络状态错误弹窗

旧版Android应用添加无网络错误弹窗实现方案

已完成的工作

  • 在StatusCodeUtil中定义了NO_NETWORK_ERROR状态码(值为3)
  • 在Activity的状态观察逻辑中添加了NO_NETWORK_ERROR分支,准备弹窗显示网络缺失提示

需要完善的核心逻辑

需要在ApiCallBack的失败回调中识别无网络状态,抛出NO_NETWORK_ERROR状态码,确保ViewModel能将状态正确转发到Activity。

步骤1:添加网络状态检查方法

在ApiCallBack类内部新增检查设备网络连接状态的工具方法:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

private boolean isNetworkAvailable() {
    ConnectivityManager cm = (ConnectivityManager) application.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null) return false;
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null && activeNetwork.isConnected();
}

步骤2:修改onFailure回调逻辑

更新onFailure方法,优先判断无网络状态,触发NO_NETWORK_ERROR:

@Override
public void onFailure(Call<ApiResponse<T>> call, Throwable t) {
    if (!isNetworkAvailable()) {
        // 无网络连接时抛出NO_NETWORK_ERROR
        if (getLogControlManager().isLog()) {
            Log.e(PARABIT_SDK_LOG, "onFailure: 无网络连接");
        }
        onError(new ApiErrorCodeInfo(StatusCodeUtil.NO_NETWORK_ERROR, "无网络连接"));
    } else if (t instanceof UnknownHostException) { 
        // 域名解析失败场景
        if (getLogControlManager().isLog()) {
            Log.e(PARABIT_SDK_LOG, "onFailure: UnknownHostException");
        }
        onError(new ApiErrorCodeInfo(StatusCodeUtil.URL_INVALID, t.getLocalizedMessage()));
    } else {
        // 其他失败场景
        if (getLogControlManager().isLog()) {
            Log.e(PARABIT_SDK_LOG, "onFailure: " + t.getLocalizedMessage());
        }
        onError(new ApiErrorCodeInfo(StatusCodeUtil.INTERNAL_SERVER_ERROR,
                t.getLocalizedMessage()));
    }
}

步骤3:添加必要权限

在AndroidManifest.xml中添加网络状态访问权限,确保网络检查功能正常:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

步骤4:确保ViewModel正确转发状态

确认ViewModel处理ApiCallBack的onError回调时,将ApiErrorCodeInfo中的状态码正确设置到loginStatusInfo中:

// 示例ViewModel中的ApiCallBack实现
new ApiCallBack<LoginData>(application) {
    @Override
    public void onApiResponse(String apiMsg, int httpStatusCode, List<LoginData> data) {
        loginStatusInfo.postValue(new LoginStatusInfo(API_SUCCESS_STATUS, apiMsg, data));
    }

    @Override
    public void onError(ApiErrorCodeInfo apiErrorCodeInfo) {
        // 将错误状态码和消息传递给Activity
        loginStatusInfo.postValue(new LoginStatusInfo(apiErrorCodeInfo.getCode(), apiErrorCodeInfo.getMessage()));
    }
}

验证逻辑

当设备断开移动数据和WiFi时,发起API请求会触发onFailure回调,网络检查方法返回false,进而抛出NO_NETWORK_ERROR状态码,Activity的观察者捕获到该状态后,会隐藏加载弹窗并显示预设的网络提示弹窗。

内容的提问来源于stack exchange,提问作者OEThe11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:20:38