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

BroadcastReceiver收网络广播时DashboardActivity提示layout不显示且报空指针异常

问题根因

你遇到的空指针异常核心是2个错误导致的:

  • 你在广播接收器中手动new DashBoardActivity()获取实例,手动创建的Activity不会走系统的生命周期流程,没有绑定布局文件,所以内部的something_wrong_LL控件没有被初始化,本身就是空值。第一次能显示大概率是你之前误用到了当前运行的Activity实例,后续调用到你手动创建的实例就会触发空指针。
  • 你当前的checkNet方法只做了无网时显示提示布局的逻辑,缺了网络恢复时隐藏布局的逻辑,同时没有做控件判空、也没有确保UI操作在主线程执行,也可能引发异常。

修复方案

1. 将广播接收器移到DashboardActivity内部动态注册

不要在单独的类里写广播接收器,直接在DashboardActivity内部定义,持有当前运行的Activity实例,同时遵循动态注册注销规则:

public class DashboardActivity extends AppCompatActivity {
    private LinearLayout something_wrong_LL;
    private BroadcastReceiver netCheckReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (isOnline(context)) {
                checkNet(true);
                Log.e("checkInternet", "App is back to Online  ");
            } else {
                checkNet(false);
                Log.e("checkInternet", "Conectivity Failure  !!! ");
            }
        }

        private boolean isOnline(Context context) {
            try {
                ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo netInfo = cm.getActiveNetworkInfo();
                return (netInfo != null && netInfo.isConnected());
            } catch (NullPointerException e) {
                e.printStackTrace();
                return false;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dashboard);
        // 必须初始化控件
        something_wrong_LL = findViewById(R.id.something_wrong_LL);
        // 注册网络监听广播
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(netCheckReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销广播,防止内存泄漏
        unregisterReceiver(netCheckReceiver);
    }

    // 修复后的checkNet方法
    public void checkNet(boolean value) {
        // 确保UI操作在主线程执行
        runOnUiThread(() -> {
            // 先判空再操作
            if (something_wrong_LL == null) return;
            if (value) {
                Log.e("Connected", "Yes ");
                // 网络恢复时隐藏提示布局
                something_wrong_LL.setVisibility(View.GONE);
            } else {
                Log.e("Connected", "NO ");
                something_wrong_LL.setVisibility(View.VISIBLE);
            }
        });
    }
}

2. 布局层级优化(可选)

你当前的xml布局中something_wrong_LL写在FrameLayout前面,会被Fragment内容覆盖,建议把提示布局移到FrameLayout后面,确保它在最上层显示,不会被Fragment的内容挡住。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:51:03