我遇到了一個相當奇怪的問題。在我的片段中,有一個代碼用于通過child().setValue(). 在另一個片段中有用戶授權,它檢查用戶是否存在,它也是使用該onDataChange()函式實作的。
檢查用戶功能 [ AuthFragment ]:
private fun checkUserExist() {
val ref = FirebaseDatabase.getInstance().getReference("Users")
ref.child(auth.uid!!)
.addValueEventListener(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
// User exist
findNavController().navigate(R.id.action_authSecondStepFragment_to_authCompletedFragment)
} else {
// User not exist
saveUser()
}
}
override fun onCancelled(error: DatabaseError) {
throw error.toException()
}
})
}
將專案添加到資料庫函式 [ AddingToDatabaseFragment ]:
private fun addToFavorite() {
val hashMap = HashMap<String, Any>()
with(args) {
hashMap["id"] = getPlaceId()
hashMap["name"] = currentPlace.name
hashMap["location"] = currentPlace.description
hashMap["image"] = currentPlace.image
hashMap["description"] = currentPlace.description
}
val ref = FirebaseDatabase.getInstance().getReference("Users")
ref.child(getProfileUid()!!)
.child("Favorites")
.child(getPlaceId())
.setValue(hashMap)
.addOnSuccessListener {
Toast.makeText(requireContext(), "Succesfully added!", Toast.LENGTH_SHORT).show()
}
.addOnFailureListener {
Toast.makeText(requireContext(), "Error!", Toast.LENGTH_SHORT).show()
}
}
實際上,問題在于,當通過該onDataChange()功能成功授權時,我進入另一個片段,我已經可以將一些專案添加到資料庫中,并且在添加(分別更改資料庫)時,PREVIOUS授權片段的onDataChange()功能,在我的情況下,是從我什至不在其中的片段中呼叫的,這會導致應用程式崩潰。我該如何解決這個問題?findNavController()
uj5u.com熱心網友回復:
由于您使用addValueEventListener,因此您正在注冊一個永久偵聽器。停用該偵聽器的唯一方法是分離它,通常是在它超出范圍時。
我通常嘗試將我對聽眾的依附和分離放在我活動的相反生命周期事件中。因此,如果我附加 inonStart我將分離 in onStop,對于onUnpause/也是如此onResume。
對于片段,您應該遵循相同的邏輯,所以onAttach-> onDetach,或onStart-> onStop,或onPause-> onResume。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/440843.html
標籤:安卓 火力基地 科特林 firebase-实时数据库 安卓架构导航
