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
相关产品推荐
相关产品推荐

