业务描述
在购物车页面点击商品的扫码跳转到扫码页面,扫到码(sn/rfid)之后回到购物车,查询码对应的商品是否在库存,在库存就填入商品信息
业务实现
在购物车页面监听扫码事件,在扫码页面扫到码之后发送事件并关闭页面
现象
扫码页面关闭后购物车页面并没有更新商品信息
排查过程
检查用户日志,发现购物车页面跳转到扫码页面后,购物车页面onDestroy了,扫码页面关闭后,购物车页面重新onCreate了,说明购物车页面重建了,所以事件监听不到。打开"不保留活动"的开发者选项,能复现问题
修复方法
一开始考虑了粘性事件,但是业务中用到了非常多事件,粘性事件会把事件缓存在内存中,加剧了内存不足的问题,所以没这么干
我们的修复方法
-
将事件监听改成registerForActivityResult回调。registerForActivityResult独立于Activity的生命周期,即使Activity重建了也能拿到回调
-
因为购物车页面拿到回调结果后会调用viewModel的方法,方法依赖viewModel的成员变量,而成员变量是在viewModel重建后网络请求回来赋值的,所以会出现成员变量空指针的问题。需要在页面的onSaveInstanceState方法保存viewModel的成员变量,在onCreate的时候恢复。registerForActivityResult回调至少会在页面Started之后,所以再去调viewModel的方法就不会出现成员变量空指针了