为什么这个问题 "Can't create handler inside thread" 发生在实时数据库上?

why is this problem "Can't create handler inside thread" happening on realtime database?

所以我试图从 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)
                        {
...
...
...
    }
});

提前致谢。

预计将从主线程调用 Firebase 实时数据库客户端。更具体地说,Firebase 客户端会在您应用的 main/UI 线程上调用 onDataChange 回调。由于 onMessageReceived 是服务的一部分,因此可以在 main/UI 线程不活动时调用它。而且,虽然我以前从未见过它,但您收到的错误消息是发生这种情况时的结果。

诀窍是 post 从您的 onMessagesReceived 到主线程(参见 ), or ensure that the looper is initialized so that your code can be called from the correct context (see Firebase Cloud Messaging: Accessing UI elements in onMessageReceived())。

借助@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() {

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

然后成功了。