【问题标题】:How to get Firebase Realtime Database server time with Kotlin in Android如何在 Android 中使用 Kotlin 获取 Firebase 实时数据库服务器时间
【发布时间】:2020-05-19 20:09:21
【问题描述】:

我需要在 Kotlin Android 应用程序中获取 Firebase 数据库当前毫秒纪元时间,我尝试将值推送到 firebase 然后读取它,我有一个按钮调用名为 pushEndTime() 的函数然后调用 read() 但它总是第一次单击时获取空值,然后在第二次单击时获取结束时间的过去值

这是代码:

private fun pushEndTime(){
    rootRef.child("user/endTime").setValue(ServerValue.TIMESTAMP)
}  

然后我阅读它使用

private fun read(){
    rootRef.child("user/endTime").addValueEventListener(
        object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                endTime = dataSnapshot.value.toString()

            }

            override fun onCancelled(databaseError: DatabaseError) {
                Log.w(TAG, "LoginData:onCancelled", databaseError.toException())
                Toast.makeText(this@HomeFragment.context, "Error! check your internet", Toast.LENGTH_LONG)
                .show()
            }
        })
}

我在onActivityCreated 中使用这些方法,如下所示:

button.setOnClickListener {
    pushEndTime()
    read()
}

我不能把pushEndTime() 放在onActivityCreated 中,它必须在一个函数中,一旦单击按钮并检查其他一些值,它就会创建 endTime,但我也尝试将它放在里面创建并仍然返回 null第一个按钮点击的结果

我在这里找到了一些建议使用Firebase.database.ServerValue.TIMESTAMP 的答案,但它对我不起作用

这就是我使用它的方式:endTime = ServerValue.TIMESTAMP.getValue(".sv") 但它返回这个值而不是纪元时间:Timestamp

我试过这个:Firebase.database.ServerValue.TIMESTAMP.getValue(".sv") 但它显示unresolved reference: ServerValue 错误

我也试过这样:Firebase.database.reference.ServerValue.TIMESTAMP.getValue(".sv") 和同样的未解决的参考错误

com.google.firebase.database.ServerValue 已导入

我需要获取firebase服务器时间,如果绝对没有办法,如何在kotlin中获取互联网时间?

【问题讨论】:

  • 您的代码是正确的。你怎么称呼这些方法。可以分享一下吗?
  • 我认为主要问题是,当您单击按钮从 Firebase 加载服务器时间时,响应需要时间。您应该实现异步以等待 Firebase 响应。
  • @KasımÖzdemir 我将其添加到问题中
  • @mamunmohamed 你能提供一些关于异步使用的好的参考吗?
  • 我试过我的答案。它工作正常。

标签: android firebase kotlin firebase-realtime-database


【解决方案1】:

你可以试试这个:

private fun pushEndTime(){
    rootRef.child("user/endTime").setValue(ServerValue.TIMESTAMP).addOnSuccessListener {
        read()
    }
}

private fun read(){
    rootRef.child("user/endTime").addListenerForSingleValueEvent(
        object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

              endTime = dataSnapshot.value.toString()

            }

            override fun onCancelled(databaseError: DatabaseError) {
                Log.w("SignedActivity.TAG", "LoginData:onCancelled", databaseError.toException())

            }
        })
}

setValue成功时调用read方法

【讨论】:

  • 第一次点击仍然为空,我这样使用它: button.setOnClickListener { pushEndTime() } 然后我打印它,但仍然从 firebase 实时数据库中获得空值
  • 谢谢,最后一个问题是我在 pushEndTime() 之后调用的另一个函数中使用了 endTime 变量,我必须全局声明 endTime,以便它不断返回 null,这是减速值,直到它得到响应,我在获取 endTime 值以确保 endTime 值已更改后,在 read() 中的 onDataChange 上调用了 checkout 函数
猜你喜欢
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
相关资源
最近更新 更多