Почему эта проблема «Не удается создать обработчик внутри потока» происходит в базе данных в реальном времени? - PullRequest
0 голосов
/ 17 сентября 2018

, поэтому я пытаюсь вызвать базу данных в реальном времени из службы firebasemessagingservice, чтобы получить некоторую информацию из базы данных, но каждый раз, когда приложение находится в фоновом режиме, эта ошибка происходит

09-17 19:27:21.596 4083-4140/? E/AndroidRuntime: FATAL EXCEPTION: Firebase-MyFirebaseMessagingService
    Process: com.kirtu.simpletexts.texts, PID: 4083
    java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
        at android.os.Handler.<init>(Handler.java:200)
        at android.os.Handler.<init>(Handler.java:114)
        at com.google.firebase.database.zza.<init>(com.google.firebase:firebase-database@@16.0.2:1024)
        at com.google.firebase.database.obfuscated.zzb.zza(com.google.firebase:firebase-database@@16.0.2:77)
        at com.google.firebase.database.obfuscated.zzu.zza(com.google.firebase:firebase-database@@16.0.2:2234)
        at com.google.firebase.database.obfuscated.zzad.zzb(com.google.firebase:firebase-database@@16.0.2:92)
        at com.google.firebase.database.obfuscated.zzad.zza(com.google.firebase:firebase-database@@16.0.2:42)
        at com.google.firebase.database.FirebaseDatabase.zza(com.google.firebase:firebase-database@@16.0.2:357)
        at com.google.firebase.database.FirebaseDatabase.getReference(com.google.firebase:firebase-database@@16.0.2:201)
        at com.kirtu.simpletexts.texts.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.java:60)
        at com.google.firebase.messaging.FirebaseMessagingService.zzd(Unknown Source)
        at com.google.firebase.iid.zzc.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at com.google.android.gms.common.util.concurrent.zza.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:761)

почему эта проблемапроисходит внезапно? раньше этого никогда не было.

вот мой код

@Override
    public void onMessageReceived(final RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
...
...
...
FirebaseDatabase.getInstance().getReference("xxxx").child(xxxx).addListenerForSingleValueEvent(new ValueEventListener()//problem is happening at this line
                    {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                        {
...
...
...
    }
});

заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

решил это с помощью ответа @Frank Van Puffelen

Мне просто нужно было поместить

FirebaseDatabase.getInstance().getReference("xxxx").child(xxxx).addListenerForSingleValueEvent(new ValueEventListener()//problem is happening at this line
                    {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                        {
...
...
...
    }
});

внутрь

Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {

.....
.....
.....}
                        });

, чтобы это сработало.

0 голосов
/ 17 сентября 2018

Ожидается, что вызовы клиента базы данных Firebase Realtime будут сделаны из основного потока.В частности, клиент Firebase вызывает обратный вызов onDataChange в главном / пользовательском интерфейсе вашего приложения.Поскольку onMessageReceived является частью службы, ее можно вызывать, когда основной поток / поток пользовательского интерфейса не активен.И, хотя я никогда не видел его раньше, сообщение об ошибке, которое вы получаете, является результатом, когда это происходит.

Хитрость заключается в том, чтобы отправлять сообщения из вашего onMessagesReceived в основной поток (см. Доступ к даннымиз службы Firebase в главном потоке ) или убедитесь, что петлитель инициализирован так, что ваш код может быть вызван из правильного контекста (см. Firebase Cloud Messaging: Доступ к элементам пользовательского интерфейса в onMessageReceived () ).

...