android - 如何等到在 kotlin 中完成查询?

标签 android firebase kotlin synchronization blocking

这个问题在这里已经有了答案:





How to return a list from Firestore database as a result of a function in Kotlin?

(3 个回答)


2年前关闭。




如果查询成功但 kotlin 是异步的,我正在尝试返回一个 bool 值。

private fun checkDidAdd(geoPoint: GeoPoint, fullAddress: String):Boolean {
        var added = false
        scope.launch {
            val docRef = db.collection("listings")
                .get()
                .addOnSuccessListener { result ->
                    for (document in result) {
                        //todo
                        }
                            added = true
                    }



                }.addOnFailureListener { exception ->
                    Log.d("TAG", "Error getting documents: ", exception)
                }
            println("done!!")
        }

        return added
    }

最佳答案

Kotlin本身不是异步的。但是,您的函数是异步的,因此您不能只返回 Boolean .实现这一点的一种方法是创建一个接口(interface)。例如:

interface ResultListener {
    fun onResult(isAdded: Boolean)
    fun onError(error: Throwable)
}

并将其传递给您的函数:
private fun checkDidAdd(geoPoint: GeoPoint, fullAddress: String, resultListener: ResultListener) {
     var added = false
    scope.launch {
        val docRef = db.collection("listings")
            .get()
            .addOnSuccessListener { result ->
                for (document in result) {
                    //todo
                    }
                    resultListener.onResult(true)
                }



            }.addOnFailureListener { exception ->
                resultListener.onError(exception)
            }
        println("done!!")
    }

    return added
}

如果您不想使用接口(interface)并且不关心错误,并且由于您使用的是 kotlin,您可以执行以下操作:
private fun checkDidAdd(geoPoint: GeoPoint, fullAddress: String, onResult: (Boolean) -> ()):Boolean {
    var added = false
    scope.launch {
        val docRef = db.collection("listings")
            .get()
            .addOnSuccessListener { result ->
                for (document in result) {
                    //todo
                    }
                       onResult(true)
                }



            }.addOnFailureListener { exception ->
                Log.d("TAG", "Error getting documents: ", exception)
            }
        println("done!!")
    }

    return added
}

关于android - 如何等到在 kotlin 中完成查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57025120/

相关文章:

Android TalkBack EditText - 提示与 contentDescription

android - 在 Android 上检测 4K UHD 屏幕

java - DocumentBuilder.parse()/解析实体

java - Android:如何使用他的电话号码登录用户

android - 将初始值设置为时间选择器

kotlin - while 表达式中不允许赋值?

android - 如何防止操作栏被切断?

javascript - Firebase查找具有特定子ID的所有 parent

firebase - 最好使用哪种登录方法?

list - 从 Kotlin 数字列表中获得一对数字