addListenerForSingleValueEvent
このようなリスナーを初めて登録すると、一度呼び出されます。 全体の機能のために、この一般的なKotlinの例を見てみましょう:それはSingle<T>
を返して
override fun <T : Any> getValue(typeClass: KClass<T>, reference: String, vararg children: String): Single<T> =
Single.create({
val databaseReference = firebaseDatabase.getReference(reference)
databaseReference.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(dbError: DatabaseError?) {
it.onError(FirebaseDatabaseException(
dbError?.message ?: context stringOf R.string.database_error,
dbError?.details ?: exceptionDetails(reference, children))
)
}
override fun onDataChange(dataSnapshot: DataSnapshot?) {
val value = childDataSnapshot(dataSnapshot, children)?.getValue(typeClass.java)
if (value != null) {
it.onSuccess(value)
} else {
it.onError(RetreivedValueNullException(exceptionDetails(reference, children)))
}
}
})
})
あなたがRxJava
を使用していない場合は、しかし、ちょうど関連Single.create
ラップを削除して、T
実装を返しますexceptionDetails()
:
private fun exceptionDetails(reference: String, children: Array<out String>): String =
"Exception occurred on reference: $reference and children: ${children.forEach { String.format("-> %s", it) }}"
および使用方法の一例(この機能は、いくつかのFirebaseRepository
にある場合:
firebaseRepository.getValue(Boolean::class, "kotran", "isActive")
.subscribeOn(Schedulers.io)
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ /* do something with the value */},
{ /* do something with the error */})
さらに詳しい情報がありますgist。
Firebaseから値を取得するには、リスナーを接続します。 https://firebase.google.com/docs/database/android/read-and-write#listen_for_value_events –
を参照してください。リスナーから値を取得できることはわかっていますが、ページが読み込まれるとonDataChangeなどのメソッドしかありません。 onDatachangeは呼び出されません。私はoncreateが呼び出されたときに値を取得したいと思います。 –
'onDataChange'はすぐに現在の値で起動します。ドキュメントから: "このメソッドは、リスナーが**接続されたときに**一度起動され、子供を含むデータが変更されるたびに再度トリガされます。"リスナーはすぐに発砲します(試してみてください)。この作業に問題がある場合は、[問題を再現する最小限のコード]を共有してください(http://stackoverflow.com/help/mcve)。 –