Firebase Runloop(3.0.0)中与持久性和查询有关的未捕获异常 [英] Uncaught exception in Firebase runloop (3.0.0) related to persistence and queries
问题描述
我已经为这个例外苦苦挣扎了一段时间. Firebase组上的一个相关线程有点死了 https://groups .google.com/forum/#!topic/firebase-talk/iy0762S3KsU ,还有两个与SO相关的问题未得到解答: Firebase Runloop(3.0.0)中未捕获的异常.请报告给support@firebase.com
I'm struggling with this exception for a while already. A relevant thread on the firebase group is kind of dead https://groups.google.com/forum/#!topic/firebase-talk/iy0762S3KsU, also two related on SO are unanswered: Uncaught exception in Firebase runloop (3.0.0) and Uncaught exception in Firebase runloop (3.0.0). Please report to support@firebase.com
解决方法是关闭数据库持久性,但对于需要脱机功能的应用程序并非不可接受.
The workaround saying to switch off database persistence works, but it's not unacceptable for apps which require offline capability.
我准备了一个最小活动示例,该示例在我的环境中重现了异常.一切都归结为使用查询读取数据库.足以启动和终止(从Android Studio中终止,而不只是退出)活动3次(很奇怪),并且在第3次启动时,它将崩溃并出现以下一系列壮观的异常(查询越多,排队的异常就越多) ):
I've prepared a minimal activity example which reproduces the exception in my environment. It all comes down to reading the database with queries. It's enough to launch and terminate ("terminate" from Android Studio, not just quit) the activity 3 times (weird) and on the 3rd launch it will crash with the following spectacular series of exceptions (the more queries queued the more exceptions i think):
07-05 18:47:10.132 20291-20291/com.mypackage D/ChimeraFileApk: Classloading successful. Optimized code found.
07-05 18:47:10.154 20291-20381/com.mypackage E/RunLoop: Uncaught exception in Firebase runloop (3.0.0). Please report to support@firebase.com
java.lang.AssertionError: hardAssert failed:
at com.google.android.gms.internal.zzaiv.zzb(Unknown Source)
at com.google.android.gms.internal.zzaiv.zzaN(Unknown Source)
at com.google.android.gms.internal.zzagh.zzb(Unknown Source)
at com.google.android.gms.internal.zzagh.<init>(Unknown Source)
at com.google.android.gms.internal.zzaga.<init>(Unknown Source)
at com.google.android.gms.internal.zzaga.<init>(Unknown Source)
at com.google.android.gms.internal.zzadp.zza(Unknown Source)
at com.google.android.gms.internal.zzaeu.zzic(Unknown Source)
at com.google.android.gms.internal.zzafc.zzRy(Unknown Source)
at com.google.android.gms.internal.zzafc.zza(Unknown Source)
at com.google.android.gms.internal.zzafc$1.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
07-05 18:47:10.154 20291-20291/com.mypackage D/AndroidRuntime: Shutting down VM
07-05 18:47:10.155 20291-20291/com.mypackage E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mypackage, PID: 20291
java.lang.RuntimeException: Uncaught exception in Firebase runloop (3.0.0). Please report to support@firebase.com
at com.google.android.gms.internal.zzadp$1$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.AssertionError: hardAssert failed:
at com.google.android.gms.internal.zzaiv.zzb(Unknown Source)
at com.google.android.gms.internal.zzaiv.zzaN(Unknown Source)
at com.google.android.gms.internal.zzagh.zzb(Unknown Source)
at com.google.android.gms.internal.zzagh.<init>(Unknown Source)
at com.google.android.gms.internal.zzaga.<init>(Unknown Source)
at com.google.android.gms.internal.zzaga.<init>(Unknown Source)
at com.google.android.gms.internal.zzadp.zza(Unknown Source)
at com.google.android.gms.internal.zzaeu.zzic(Unknown Source)
at com.google.android.gms.internal.zzafc.zzRy(Unknown Source)
at com.google.android.gms.internal.zzafc.zza(Unknown Source)
at com.google.android.gms.internal.zzafc$1.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
07-05 18:47:10.165 20291-20381/com.mypackage E/RunLoop: Uncaught exception in Firebase runloop (3.0.0). Please report to support@firebase.com
java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.google.android.gms.internal.zzafj.zzg(com.google.android.gms.internal.zzaew)' on a null object reference
at com.google.android.gms.internal.zzafc.zzf(Unknown Source)
at com.google.firebase.database.Query$3.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
07-05 18:47:10.166 20291-20381/com.mypackage E/RunLoop: Uncaught exception in Firebase runloop (3.0.0). Please report to support@firebase.com
java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.google.android.gms.internal.zzafj.zzg(com.google.android.gms.internal.zzaew)' on a null object reference
at com.google.android.gms.internal.zzafc.zzf(Unknown Source)
at com.google.firebase.database.Query$3.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
07-05 18:47:10.173 20291-20381/com.mypackage E/RunLoop: Uncaught exception in Firebase runloop (3.0.0). Please report to support@firebase.com
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.internal.zzafg.zzg(com.google.android.gms.internal.zzafa, com.google.android.gms.internal.zzahu)' on a null object reference
at com.google.android.gms.internal.zzafc.zzb(Unknown Source)
at com.google.android.gms.internal.zzafc.zza(Unknown Source)
at com.google.android.gms.internal.zzafc.zzaO(Unknown Source)
at com.google.firebase.database.connection.idl.IPersistentConnectionImpl$3.zzaO(Unknown Source)
at com.google.firebase.database.connection.idl.zzi$zza.onTransact(Unknown Source)
at android.os.Binder.transact(Binder.java:387)
at alx.a(:com.google.android.gms.DynamiteModulesC:196)
at amb.a(:com.google.android.gms.DynamiteModulesC:330)
at akh.a(:com.google.android.gms.DynamiteModulesC:3591)
at amf.a(:com.google.android.gms.DynamiteModulesC:386)
at aln.onTransact(:com.google.android.gms.DynamiteModulesC:50)
at android.os.Binder.transact(Binder.java:387)
at com.google.firebase.database.connection.idl.zzf$zza$zza.zzhT(Unknown Source)
at com.google.firebase.database.connection.idl.IPersistentConnectionImpl$5$1.zzhT(Unknown Source)
at com.google.android.gms.internal.zzaeu$1$1.zzhT(Unknown Source)
at com.google.android.gms.internal.zzadn$1.onFailure(Unknown Source)
at com.google.android.gms.tasks.zzd$1.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
07-05 18:47:11.745 20291-20291/com.mypackage I/Process: Sending signal. PID: 20291 SIG: 9
崩溃是在获取对数据库的引用并完成持久性设置后的首次尝试读取.
The crash is on the first attempt to read after getting the reference to the database and setting persistence is done.
这里是活动:
public class TestRunloopException extends AppCompatActivity {
private static final String TAG = "test";
private Handler mHandler = new Handler();
Runnable mReadScoresRunnable = new Runnable() {
@Override
public void run() {
readScores();
mHandler.postDelayed(mReadScoresRunnable, 5000);
}
};
@Override
protected void onStart() {
super.onStart();
mHandler.postDelayed(mReadScoresRunnable, 3000);
}
void readScores() {
DatabaseReference scoresRef = getDatabase().getReference("scores");
//it occurs even with a single query..
//scoresRef.startAt(51).limitToFirst(3).addListenerForSingleValueEvent(new MyValueListener());
scoresRef.endAt(50).limitToLast(4).addListenerForSingleValueEvent(new MyValueListener());
}
public static class MyValueListener implements ValueEventListener {
@Override
public void onDataChange(DataSnapshot data) {
Log.d(TAG, "onDataChange: " + data.getValue());
}
@Override
public void onCancelled(DatabaseError error) {
Log.d(TAG, "onCancelled: " + error.getMessage());
}
}
// access-wrapper, set persistence only once
private static FirebaseDatabase mDatabase;
public static FirebaseDatabase getDatabase() {
if (mDatabase == null) {
mDatabase = FirebaseDatabase.getInstance();
mDatabase.setPersistenceEnabled(true);
}
return mDatabase;
}
}
分数"节点没有特定的安全设置:"scores": { ".read": true, ".write": true } ...
The "scores" node has no particular security settings: "scores": { ".read": true, ".write": true } ...
在firebase-*:9.0.2上进行了测试,但在9.2.0中也发现了该错误.
Tested with firebase-*:9.0.2, but the bug has been also observed with 9.2.0.
如何避免在同一个引用/节点上使用多个查询并且当然具有持久性时发生崩溃?
How to avoid the crash while using multiple queries on the same reference/node and of course having persistence?
推荐答案
我遇到了同样的问题,我只是在build.gradle(应用程序模块)上修复了更新版本的firebase-core和firebase-database
I had the same problem, i just fixed updating a version of firebase-core and firebase-database on build.gradle (app module)
dependencies {
...
implementation 'com.google.firebase:firebase-core:17.1.0'
implementation 'com.google.firebase:firebase-database:19.0.0'
}
您可以在 https://firebase.google上检查是否具有当前版本.com/support/release-notes/android
这篇关于Firebase Runloop(3.0.0)中与持久性和查询有关的未捕获异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!