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

