You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:57:00