Android Firebase runloop(3.0.0)中与持久性和查询相关的未捕获异常
我已经为这个例外挣扎了一段时间了。firebase组中的一个相关线程有点死了,还有两个相关线程没有得到响应:和 解决办法是关闭数据库持久性,但对于需要离线功能的应用程序来说,这并不是不可接受的 我准备了一个最小活动示例,它在我的环境中再现了异常。这一切都归结为通过查询读取数据库。这足以启动和终止活动3次(奇怪),在第3次启动时,它将崩溃,出现以下一系列异常(我认为排队的查询越多,异常就越多): “分数”节点没有特定的安全设置:Android Firebase runloop(3.0.0)中与持久性和查询相关的未捕获异常,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我已经为这个例外挣扎了一段时间了。firebase组中的一个相关线程有点死了,还有两个相关线程没有得到响应:和 解决办法是关闭数据库持久性,但对于需要离线功能的应用程序来说,这并不是不可接受的 我准备了一个最小活动示例,它在我的环境中再现了异常。这一切都归结为通过查询读取数据库。这足以启动和终止活动3次(奇怪),在第3次启动时,它将崩溃,出现以下一系列异常(我认为排队的查询越多,异常就越多): “分数”节点没有特定的安全设置:“分数”:{.read:true,.write:true}… 使用fi
“分数”:{.read:true,.write:true}…
使用firebase-*:9.0.2进行测试,但在9.2.0中也观察到了该错误
如何避免在同一引用/节点上使用多个查询时发生崩溃,当然还有持久性?唯一对我有效的解决方案是背对背调用事件侦听器两次
scoresRef.endAt(50).limitToLast(4).addListenerForSingleValueEvent(new MyValueListener());
scoresRef.endAt(50).limitToLast(4).addListenerForSingleValueEvent(new MyValueListener());
我也有同样的问题,我刚刚修复了在build.gradle(应用程序模块)上更新firebase core和firebase数据库的版本 您可以检查是否有当前版本,请参见此线程上的
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;
}
}
scoresRef.endAt(50).limitToLast(4).addListenerForSingleValueEvent(new MyValueListener());
scoresRef.endAt(50).limitToLast(4).addListenerForSingleValueEvent(new MyValueListener());
dependencies {
...
implementation 'com.google.firebase:firebase-core:17.1.0'
implementation 'com.google.firebase:firebase-database:19.0.0'
}