Android应用类静态变量在ValueEventListener赋值后外部读取为0问题
问题根本原因
这和numOfUsers是不是静态变量、有没有访问权限完全无关,核心是Firebase数据库操作的异步执行特性:
你调用addListenerForSingleValueEvent添加监听器时,只是向Firebase服务端提交了一个查询请求,程序不会阻塞等待请求返回结果,而是会立刻执行后面的userinfo.setText(String.valueOf(numOfUsers))代码。此时第二个监听器的onDataChange回调还没有被触发,numOfUsers还保持着初始化的默认值0,所以显示结果为0。
你把更新UI的代码移到onDataChange内部后正常,是因为onDataChange本身是请求成功后的回调方法,只有等数据库返回了查询结果,这个方法才会执行,此时numOfUsers已经被赋值为正确的用户总数,所以能拿到正确值。
解决方案
- 方案1(推荐常规写法):所有依赖数据库查询结果的逻辑,都放在对应监听器的
onDataChange回调内部执行,避免异步时序问题。 - 方案2(适配多业务场景):如果有多处逻辑需要用到用户统计结果,可以用自定义回调接口或者LiveData这类可观察容器包装
numOfUsers,监听数值变更后再统一执行后续逻辑,避免多层回调嵌套。
内容的提问来源于stack exchange,提问作者user16931025
相关产品推荐
相关产品推荐

