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

如何阻止Codename One中Lifecycle.java的handleNetworkError方法弹出Dialog?

阻止网络错误弹窗显示的几种可行方案

方案1:在原方法中添加HTTP状态码判断,仅针对真实网络错误弹窗

直接修改Lifecycle.java中的handleNetworkError方法,区分真实网络连接错误(如无网络、连接超时、DNS解析失败)和HTTP业务状态码错误(400、404、401等),只在前者情况下显示弹窗:

protected void handleNetworkError(NetworkEvent err) {
    err.consume();
    if (err.getError() != null) {
        Log.e(err.getError());
    }
    Log.sendLogAsync();

    // 获取HTTP状态码,根据你的NetworkEvent实际API调整(比如err.getStatusCode())
    int statusCode = err.getStatusCode();
    // 仅当状态码为0(无网络/连接失败)或5xx服务器错误时,才显示弹窗
    // 400-499属于客户端业务错误,无需打扰用户
    if (statusCode == 0 || (statusCode >= 500 && statusCode < 600)) {
        Dialog.show("Connection Error", "There was a networking error in the connection to " + err.getConnectionRequest().getUrl(), "OK", null);
    }
}

方案2:重写handleNetworkError方法(如果允许继承)

如果Lifecycle是可继承的父类,在你的业务子类中重写该方法,完全控制弹窗逻辑:

@Override
protected void handleNetworkError(NetworkEvent err) {
    // 保留原有日志逻辑
    err.consume();
    if (err.getError() != null) {
        Log.e(err.getError());
    }
    Log.sendLogAsync();

    // 仅根据业务需求选择性显示弹窗,或直接移除弹窗代码
    int statusCode = err.getStatusCode();
    if (statusCode == 0) { // 仅无网络时提示用户
        Dialog.show("提示", "当前网络不可用,请检查网络设置", "确定", null);
    }
    // 400/404等状态码直接跳过弹窗,由业务逻辑自行处理
}

方案3:添加请求级别的开关控制

给ConnectionRequest添加一个自定义标记,允许单个请求决定是否显示错误弹窗:

  1. 先给ConnectionRequest添加属性和方法:
public class ConnectionRequest {
    private boolean showErrorDialog = true; // 默认显示

    public void setShowErrorDialog(boolean show) {
        this.showErrorDialog = show;
    }

    public boolean isShowErrorDialog() {
        return showErrorDialog;
    }

    // 原有其他方法...
}
  1. 在发起请求时,根据业务需求关闭弹窗:
ConnectionRequest request = new ConnectionRequest(url);
request.setShowErrorDialog(false); // 该请求不显示错误弹窗
// 执行请求...
  1. 修改handleNetworkError方法判断标记:
protected void handleNetworkError(NetworkEvent err) {
    err.consume();
    if (err.getError() != null) {
        Log.e(err.getError());
    }
    Log.sendLogAsync();

    // 仅当请求允许时才显示弹窗
    if (err.getConnectionRequest().isShowErrorDialog()) {
        Dialog.show("Connection Error", "There was a networking error in the connection to " + err.getConnectionRequest().getUrl(), "OK", null);
    }
}

方案4:直接移除弹窗代码(最彻底)

如果所有网络错误都不需要给用户显示这个技术弹窗,直接删除Dialog.show(...)这一行即可:

protected void handleNetworkError(NetworkEvent err) {
    err.consume();
    if (err.getError() != null) {
        Log.e(err.getError());
    }
    Log.sendLogAsync();
    // 移除Dialog.show这一行
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:08:29