如何从Firestore获取订单ID传给适配器并避免空指针异常
问题原因
Activity生命周期执行顺序比Firestore异步回调快,onStart方法执行时,异步请求还没返回,addToCartAdaptor还没完成初始化,所以调用方法会触发空指针。同时如果用户没有匹配的未支付订单,addToCartAdaptor本来就不会被初始化,也会触发空指针。
修复方案
1. 生命周期方法增加空判断兜底
修改onStart和onStop方法,调用适配器方法前先判空:
@Override protected void onStart() { super.onStart(); // 仅当适配器初始化完成后才调用监听方法 if (addToCartAdaptor != null) { addToCartAdaptor.startListening(); } } @Override protected void onStop() { super.onStop(); // 仅当适配器初始化完成后才调用监听方法 if (addToCartAdaptor != null) { addToCartAdaptor.stopListening(); } }
2. 适配器初始化后直接启动监听
因为异步回调返回时onStart已经执行完毕,所以在初始化适配器的回调里,设置完适配器后直接启动监听:
在setUpRecycleView方法的异步回调中,recyclerView.setAdapter(addToCartAdaptor); 后补充代码:
recyclerView.setAdapter(addToCartAdaptor); // 新增:初始化完成后直接启动监听 addToCartAdaptor.startListening();
3. 可选优化
- 把RecyclerView的初始化逻辑(findViewById、setHasFixedSize、setLayoutManager)移到
onCreate方法中,不要放在异步回调里,减少重复操作。 - 增加Firestore查询失败的处理逻辑,判断
task.isSuccessful(),查询失败时给用户提示。 - 增加购物车为空的状态展示,当没有匹配的未支付订单时,显示空布局提示用户,避免页面空白。
内容的提问来源于stack exchange,提问作者Mumba Mukendi
相关产品推荐
相关产品推荐

