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

Retrofit2的onFailure如何区分不同异常展示对应提示

Retrofit2 多场景网络异常精准区分实现方案

前置准备

首先在AndroidManifest.xml中添加网络状态查询权限:

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

该权限为普通安装权限,安装后自动授予,无需动态申请。

实现工具方法

在页面中添加两个网络状态判断方法,分别用于识别本地网络连接状态、已连接网络的互联网访问能力:

/**
 * 判断设备是否已连接WiFi/移动数据(不保证能访问公网)
 */
private boolean isNetworkConnected() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null) return false;
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}

/**
 * 判断已连接的网络是否可正常访问公网(仅支持Android 6.0及以上)
 */
@RequiresApi(Build.VERSION_CODES.M)
private boolean isNetworkValidated() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null) return false;
    Network activeNet = cm.getActiveNetwork();
    NetworkCapabilities caps = cm.getNetworkCapabilities(activeNet);
    return caps != null && caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}

替换onFailure回调逻辑

直接替换原有onFailure实现,按照「本地网络状态→网络有效性→异常类型」的层级判断,即可精准区分三类场景:

@Override
public void onFailure(Call<YourResponseBean> call, Throwable t) {
    String showTip;
    // 场景1:WiFi/移动数据完全关闭,未连接任何网络
    if (!isNetworkConnected()) {
        showTip = "网络已断开,请打开WiFi或移动数据后重试";
    } else {
        // 本地已连接网络,进一步细分
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !isNetworkValidated()) {
            // 场景2:已连网但无法访问互联网
            showTip = "网络连接异常,当前网络无法访问互联网,请检查后重试";
        } else if (t instanceof UnknownHostException) {
            // 场景3:网络正常但域名解析失败,即域名不存在/服务端域名配置错误
            showTip = "服务访问异常,请稍后重试";
        } else if (t instanceof SocketTimeoutException || t instanceof ConnectException) {
            showTip = "请求连接超时,请检查网络后重试";
        } else {
            showTip = "请求失败,请稍后重试";
        }
    }
    Toast.makeText(MainActivity.this, showTip, Toast.LENGTH_SHORT).show();
}

注意事项

  • 禁止直接使用t.getMessage()的文案做判断依据,不同系统版本、不同ROM返回的异常文案不统一,兼容性极差。
  • Android 6.0以下版本无系统级网络有效性校验能力,可在低版本命中UnknownHostException时统一展示通用网络异常提示,覆盖绝大多数用户场景。
  • 若项目中自定义了OkHttp的DNS解析器,自定义解析逻辑抛出的异常需继承自UnknownHostException,否则会导致类型判断失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:42:18