Запрос Firestore заканчивает тем, что создал многократные уведомления pu sh для той же самой информации - PullRequest
0 голосов
/ 14 января 2020

В моем коде Kotlin я запрашиваю Firestore на предмет изменений, и на основании условия пользователю отправляется уведомление. Нормально ли для кода отправлять одно и то же уведомление 4 раза, если в базе данных изменяются 4 поля? я ожидал, что будет отправлено только одно уведомление. мой код выглядит следующим образом:

docref.collection("Users").whereEqualTo("uid", userid!!)
        .addSnapshotListener { value, task ->

            if(task!=null){

                return@addSnapshotListener
            }

            for (document in value!!) {

                val current_user_bid_lead_num = document.getLong("bid_lead")!!

                val new_user_bid_lead_num = current_user_bid_lead_num + 1



                docref.collection("winning_bid").whereEqualTo("previous_seller_id",userid!!).addSnapshotListener{value, task->

                    if(task!=null){

                        return@addSnapshotListener
                    }

                    for (document in value!!){

                        Log.d("userid",userid)

                        val losing_seller = document.getString("previous_seller_id")
                        val deal_num_lost = document.getLong("deal_num")!!
                        val winningbid_bid_lead_num = document.getLong("bid_lead")!!

                        if(usersid == losing_seller && current_user_bid_lead_num < winningbid_bid_lead_num) {

                            LosingBidNotificationChannel()

                            val CHANNEL_ID = "Losing Bid"

                            val intent = Intent(this, Mydeals_seller::class.java).apply {
                                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
                            }

                            val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)

                            val builder = NotificationCompat.Builder(this, CHANNEL_ID)
                                .setSmallIcon(R.drawable.openbidicon)
                                .setContentTitle("OpenBid")
                                .setContentText("Your bid has lost the lead")
                                .setStyle(
                                    NotificationCompat.BigTextStyle()
                                        .bigText("Your bid is no longer leading for Deal #${deal_num_lost}")
                                )
                                .setPriority(NotificationCompat.PRIORITY_HIGH)
                                .setContentIntent(pendingIntent)
                                .setChannelId(CHANNEL_ID)
                                .setAutoCancel(true)
                                .build()


                            with(NotificationManagerCompat.from(this)) {

                                notify(id, builder)
                                id++
                            }
                        }

                        newdealnumref = FirebaseFirestore.getInstance().collection("Users")

                        newdealnumref.document(userid).update("bid_lead",winningbid_bid_lead_num).addOnSuccessListener {

                        }.addOnFailureListener{e->

                            Log.w("firestore_create_error","Error writing to document",e)
                        }
                    }
                }
            }
        }

Итак, я получаю результаты правильного всплывающего уведомления, но не ожидаю уведомления, потому что в базе данных изменилось несколько полей.

Например, val losing seller и val winningbid_bid_lead_num могут измениться одновременно, что приведет к отправке 2 уведомлений. Как я могу ограничить это?

Редактировать: Протестировав его немного дальше, я заметил, что приложение, похоже, накапливает уведомления, и даже если я очищаю их и моделирую процесс, один раз уведомление публикуется, общее количество всплывающих уведомлений будет увеличиваться, например, с 10 до 16. Таким образом, есть способ очистить память от ранее очищенных уведомлений.

Обновление - проблема Похоже, что связано с этой частью:

with(NotificationManagerCompat.from(this)) {

                                notify(id, builder)
                                id++
                            }
                        }

Но если я не включу вышеперечисленное, я не смогу показать более 1 нового уведомления. Является ли вышеуказанный правильный способ отображения более 1 нового уведомления, но при этом android не накапливает счетчик и не отправляет одно и то же уведомление несколько раз на основе указанного выше счетчика? Например, есть ли проверка, которую я могу запустить, если она проверяет, было ли уведомление очищено, и если оно было, то сбросьте счетчик на 0?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...