为什么这个问题 "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() {
.....
.....
.....}
});
然后成功了。
所以我试图从 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
到主线程(参见
借助@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() {
.....
.....
.....}
});
然后成功了。