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

