Невидимый бесконечный цикл - PullRequest
0 голосов
/ 21 мая 2018

В моем коде бесконечный цикл.Пока я полностью не закрыл программу, она постоянно записывает данные в мою базу данных Firebase ... Мне очень нужна помощь, пожалуйста, помогите.Я хочу, чтобы моя функция MemberAdding выполнялась всего один раз после нажатия кнопки ...

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)
}

}

ниже, я также отправлю класс адаптера, который использую

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
}
}

моей начальной строкислушатель .....

interface GroupMemberAddingRowListener {
    fun MemberAdding (accountKey:String)
}

Если вам нужно больше частей кода, просто скажите мне .... Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Я обнаружил проблему

DBdatabaseName!!.reference!!.child(user!!.currentUser!!.uid).child("Group-List").addValueEventListener(object : ValueEventListener{
    override fun onDataChange(dataSnapshot: DataSnapshot) {

Строка заставляет onDataChange вызываться каждый раз при изменении данных ... (виновник addValueEventListener), поэтому я изменил его на вызовы

BdatabaseName!!.reference!!.child(user!!.currentUser!!.uid).child("Group-List").addListenerForSingleValueEvent(object : ValueEventListener{
        override fun onDataChange(dataSnapshot: DataSnapshot) {

addListenerForSingleValueEventonDataChange только один раз, чем уничтожает все обратные вызовы

0 голосов
/ 22 мая 2018

Во-первых, вам нужно было отладить и посмотреть, где это происходит, в любом случае, я думаю, что это внутри реализации onDataChanged Так как вы запускаете:

 DBdatabaseName!!.reference!!.child(user!!.currentUser!!.uid).child("Group-List").child("Groups").child(groupKey).child("members").setValue(flag3)

setValue снова вызовет onDataChanged.

...