Reputation: 11
I have an infinite loop in my code. Until I completely shut down the program, it is continuously writing data to my Firebase database... I am in real need, please help. I want my function MemberAdding execute just one time after button is clicked...
override fun MemberAdding(accountKey: String) {
DBdatabaseName!!.reference!!.child(user!!.currentUser!!.uid).child("Group-List").addValueEventListener(object : ValueEventListener{
override fun onDataChange(dataSnapshot: DataSnapshot) {
groupKey = intent.getStringExtra("GroupKey")
val flag = dataSnapshot.child("Groups").child(groupKey).child("members").value.toString()
val newpath = "member" + flag
DBdatabaseName!!.reference!!.child(user!!.currentUser!!.uid).child("Group-List").child("Groups").child(groupKey).child(newpath).setValue(accountKey)
}
override fun onCancelled(databaseError: DatabaseError) {
}
})
DBdatabaseName!!.reference!!.child(user!!.currentUser!!.uid).child("Group-List").addValueEventListener(object : ValueEventListener{
override fun onDataChange(dataSnapshot: DataSnapshot) {
val groupKey = intent.getStringExtra("GroupKey")
var flag = dataSnapshot.child("Groups").child(groupKey).child("members").value.toString()
val flag2 = flag.toInt()
val flag3 = flag2 + 1
DBdatabaseName!!.reference!!.child(user!!.currentUser!!.uid).child("Group-List").child("Groups").child(groupKey).child("members").setValue(flag3)
}
override fun onCancelled(databaseError: DatabaseError) {
}
})
refresh()
}
private fun refresh() {
groupKey = intent.getStringExtra("GroupKey")
val intent = Intent(this@GroupMemberAddingActivity, GroupMemberAddingActivity::class.java)
intent.putExtra("GroupKey", groupKey)
startActivity(intent)
}
}
at below i will also send the Adapter class that i am using
class GroupMemberAddingItemAdapter (context: Context, friendItemList: MutableList<FriendItem>) : BaseAdapter() {
private class ListRowHolder (row: View? ) {
val label: TextView = row!!.findViewById(R.id.friendName_textview) as TextView
val addMember: Button? = row!!.findViewById(R.id.addMember_button) as Button
}
private val mInflater: LayoutInflater = LayoutInflater.from(context)
private var itemList = friendItemList
private var mView: View? = null
private var rowListener: GroupMemberAddingRowListener = context as GroupMemberAddingRowListener
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val friendName: String = itemList.get(position).friendName as String
val friendLastName: String = itemList.get(position).friendLastName as String
val friendemail: String = itemList.get(position).accountKey as String
val vh: ListRowHolder
if (convertView == null) {
mView = mInflater.inflate(R.layout.groupmemberadding_row, parent, false)
vh = ListRowHolder(mView)
mView!!.tag = vh
} else {
mView = convertView
vh = mView!!.tag as ListRowHolder
}
vh.label.text = "$friendName $friendLastName"
vh.addMember!!.setOnClickListener{rowListener.MemberAdding(friendemail)}
return mView!!
}
override fun getItem(index: Int): Any {
return itemList[index]
}
override fun getItemId(index: Int): Long {
return index.toLong()
}
override fun getCount(): Int {
return itemList.size
}
}
my initial row listener is.....
interface GroupMemberAddingRowListener {
fun MemberAdding (accountKey:String)
}
If you need any more code parts just tell me.... Thanks for helping
Upvotes: 0
Views: 230
Reputation: 11
I found the problem
DBdatabaseName!!.reference!!.child(user!!.currentUser!!.uid).child("Group-List").addValueEventListener(object : ValueEventListener{
override fun onDataChange(dataSnapshot: DataSnapshot) {
Line makes onDataChange is called back every time data changes...(culprit is addValueEventListener) so i changed it to
BdatabaseName!!.reference!!.child(user!!.currentUser!!.uid).child("Group-List").addListenerForSingleValueEvent(object : ValueEventListener{
override fun onDataChange(dataSnapshot: DataSnapshot) {
addListenerForSingleValueEvent calls the onDataChange only once than destroys the all callbacks
Upvotes: 0
Reputation: 18276
First, you had to debug and look where it happens, anyway I think it is inside onDataChanged
implementation
Since you fire:
DBdatabaseName!!.reference!!.child(user!!.currentUser!!.uid).child("Group-List").child("Groups").child(groupKey).child("members").setValue(flag3)
setValue will happen to fire onDataChanged again.
Upvotes: 1