Android: база данных Firebase в реальном времени не обновляется, когда приложение работает в фоновом режиме

Я пытаюсь обновить firebase realtime database с FirebaseMessagingService, но при обновлении с FirebaseMessagingService он не обновляется.

Таким образом, логика заключается в том, что когда пользователь A отправляет сообщение пользователю B (приложение в фоновом режиме), он вызывает FirebaseMessagingService после сохранения сообщения в локальной базе данных, мне нужно обновить статус сообщения на «доставлено», чтобы пользователь A получил уведомление о том, что его сообщение дошло до пользователя B. Пользователь B. получаю уведомления, и я вижу в журналах, что журнал пользователя B был выполнен до установки этого значения, и его прослушиватель никогда не вызывается для успеха или неудачи. Я также перепроверил правильность ссылки на базу данных.

Я попробовал использовать методы setValue и updateChildren, но не смог обновить данные. Я удалил прослушиватель для чистого кода.

1:

DatabaseReference messageRef = databaseReference.child(messageNodeKey);
Map<String, Object> update = new HashMap<>();
update.put("Status", msgstatus);
messageRef.updateChildren(update);

2:

DatabaseReference messageRef = databaseReference.child(messageNodeKey).child("Status");
messageRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        Log.d(TAG, "onDataChange: "+snapshot+" "+snapshot.exists());
        if (snapshot.exists()) {
            messageRef.setValue(msgstatus)   
        }
    }
}           

Я могу обновить значение, когда устройство находится на переднем плане, но не когда оно звонит из FirebaseMessagingService. Может ли кто-нибудь помочь мне решить эту проблему.

Обновление: после включения отладки и попытки с помощью setvalue

DatabaseReference messageRef = databaseReference.child(messageNodeKey).child("Status");
messageRef.setValue(msgstatus)

Журнал после включения отладки Firebase

RepoOperation D  set: /Chat/xxx-aaa/messages/-O5eF3_t0HESRIzjS4HE/Status
DataOperation D  set: /Chat/xxx-aaa/messages/-O5eF3_t0HESRIzjS4HE/Status Delivered
RepoOperation D  Aborting transactions for path: /Chat/xxx-aaa/messages/-O5eF3_t0HESRIzjS4HE/Status. Affected: 
WM-WorkerWrapper I  Worker result SUCCESS for Work [ id=40fbeba3-c39c-49dc-8c09-deda65767395, tags = { com.elaxer.Settings_Fragmets.Notification_WorkManager, Notification } ]
System W  Ignoring header X-Firebase-Locale because its value was null.
LocalRequestInterceptor W  Error getting App Check token; using placeholder token instead. Error: com.google.firebase.FirebaseException: No AppCheckProvider installed.
2024-09-01 02:34:05.829 FirebaseAuth D  Notifying id token listeners about user ( xxx ).

Голосующий против Не могли бы вы сообщить мне, почему вы голосуете против вопроса?

androidXP 31.08.2024 20:49

(не тот, кто понижает голос) Скорее всего, Android закроет соединение через несколько минут, когда приложение работает в фоновом режиме. Если вы включите ведение журнала отладки, возможно, вы сможете это подтвердить.

puf - Frank van Puffelen 31.08.2024 21:34

@puf-FrankvanPuffelen Все происходит за 3-4 секунды от получения уведомления до создания последнего журнала перед обновлением базы данных. Тем не менее я установлю журнал отладки для получения дополнительной информации. Я скоро обновлю

androidXP 31.08.2024 21:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Скорее всего, Android закроет соединение через несколько минут, когда приложение работает в фоновом режиме. Из документации :

На Android Firebase автоматически управляет состоянием соединения, чтобы уменьшить пропускную способность и расход заряда батареи. Когда у клиента нет активных прослушивателей, ожидающих операций записи или onDisconnect и он не отключен явно методом goOffline, Firebase закрывает соединение через 60 секунд бездействия.

Если вы включите ведение журнала отладки, возможно, вы сможете это подтвердить.

Если это действительно причина, вы можете (обнаружить это состояние соединения и затем) переключить клиент Firebase в автономный режим , а затем в онлайн, чтобы вернуться в подключенное состояние.

Пожалуйста, проверьте обновленный код с новыми журналами Firebase.

androidXP 31.08.2024 23:17

Вместо того, чтобы просить меня проверить ваши журналы, имеет ли смысл первая часть моего ответа и может ли она объяснить, что происходит в вашем приложении? Если да, то подтвердили ли результаты журнала, что это так?

puf - Frank van Puffelen 31.08.2024 23:48

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

androidXP 31.08.2024 23:51

А еще я addOnCompleteListener и addOnFailureListener, но никому не позвонили. Я не использую AppCheckProvider, который также отображается в журнале.

androidXP 01.09.2024 00:29

Если ни ваш onComplete, ни onFailed не вызывается, клиент обычно не подключен к сети, что соответствует тому, что я сказал в своем ответе.

puf - Frank van Puffelen 01.09.2024 00:37

goOnline работает, но вызывает другие проблемы, например, обновляет время последней активности пользователя, но мне нужно это выяснить. Главный вопрос решается по телефону goOnline(); . Большое спасибо за вашу помощь.

androidXP 01.09.2024 02:32

Другие вопросы по теме