Android中HashMap值无法获取,日志始终显示0的技术问题
问题解决:Firestore异步操作导致HashMap值未更新
你的问题核心是Firestore的get()是异步操作,你在回调外部打印HashMap的代码会先于回调里的数据处理执行,此时HashMap还是初始化的0值,所以日志始终显示0。
修复方案
1. 将日志代码移到异步回调内部
确保在Firestore数据获取并处理完成后,再读取HashMap的值:
class Analyze : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_analyze) supportActionBar!!.setDisplayHomeAsUpEnabled(true) val hashMap : HashMap<String, Int> = HashMap() hashMap["Travel"] = 0 hashMap["Grocery"] = 0 hashMap["Food"] = 0 hashMap["One Time Cost"] = 0 hashMap["Entertainment"] = 0 hashMap["Other Cost"] = 0 val db = Firebase.firestore val user = Firebase.auth.currentUser user?.uid?.let { uid -> // 直接过滤当前用户的文档,减少数据传输 db.collection("posts") .whereEqualTo("uid", uid) .get() .addOnSuccessListener { documents -> for (document in documents) { val amountStr = document.getString("amount") val amount = amountStr?.toIntOrNull() ?: 0 // 处理空或非数字的情况 val locate = document.getString("locate") ?: "Other Cost" // 默认分类 if (hashMap.containsKey(locate)) { val count = hashMap[locate] ?: 0 hashMap[locate] = count + amount } else { hashMap[locate] = amount } } // 数据处理完成后再打印日志 val c = hashMap["Travel"] Log.d("success1", "message $c") val e = hashMap["Food"] Log.d("success2", "message $e") } .addOnFailureListener { exception -> Log.e("FirestoreError", "获取数据失败", exception) } } ?: run { // 处理用户未登录的情况 Log.w("AuthError", "用户未登录") } } }
2. 关键优化点
- 异步回调内操作:所有依赖Firestore数据的逻辑(包括打印日志)都要放在
addOnSuccessListener内部,确保数据已加载完成。 - 查询过滤:用
whereEqualTo("uid", uid)直接在Firestore端过滤当前用户的文档,避免下载无关数据,提升性能。 - 空安全处理:用
toIntOrNull()替代Integer.parseInt(),避免amount为空或非数字时抛出异常;给locate设置默认值,防止空字符串导致的分类错误。
内容的提问来源于stack exchange,提问作者Ajay Satpati
相关产品推荐
相关产品推荐

