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

无产品用户查看数据时Activity indicator无法结束问题求助

嘿,我来帮你搞定这个ActivityIndicator停不下来的问题!

这个问题其实挺常见的——大概率是你处理Firebase数据的逻辑里,只在有产品数据返回的时候才触发了停止指示器的操作,而当用户没有任何产品时,这个停止的代码被漏掉了,导致指示器一直在转。

核心解决方案:覆盖所有加载结束的场景

不管Firebase返回的是有数据、空数据还是加载失败,都必须调用停止指示器的方法,不能只在“有数据”的分支里写。

先看你可能犯的典型错误(类似这样的代码)

// 假设是Kotlin,其他语言逻辑一致
activityIndicator.startAnimating()
firebaseFirestore.collection("products")
    .whereEqualTo("userId", currentUserId)
    .get()
    .addOnSuccessListener { snapshot ->
        if (snapshot.exists()) {
            // 处理产品数据
            activityIndicator.stopAnimating() // 只有有数据时才停止
        }
    }
    .addOnFailureListener { e ->
        activityIndicator.stopAnimating() // 失败时停止了,但空数据没处理
    }

修改后的正确代码

把停止指示器的逻辑移到分支外面,不管有没有数据都执行:

activityIndicator.startAnimating()
firebaseFirestore.collection("products")
    .whereEqualTo("userId", currentUserId)
    .get()
    .addOnSuccessListener { snapshot ->
        if (snapshot.exists()) {
            // 处理有产品的情况:更新UI展示产品列表
        } else {
            // 处理无产品的情况:比如显示"暂无产品"的空状态提示
        }
        // 关键:不管有没有数据,这里都停止指示器
        activityIndicator.stopAnimating()
    }
    .addOnFailureListener { e ->
        // 处理加载失败:比如弹出错误提示
        activityIndicator.stopAnimating()
    }

额外优化建议

  1. 封装停止逻辑:可以把停止指示器的代码抽成一个单独的方法,避免重复写,也不容易漏:

    private fun stopLoading() {
        activityIndicator.stopAnimating()
    }
    

    然后在成功、失败、空数据的分支里直接调用stopLoading()就行。

  2. 实时监听的情况:如果用的是addSnapshotListener实时监听数据,同样要在每次回调里都执行停止操作,同时记得在页面销毁时移除监听,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Ofri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:54:27