Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase runloop(3.0.0)中与持久性和查询相关的未捕获异常_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android Firebase runloop(3.0.0)中与持久性和查询相关的未捕获异常

Android Firebase runloop(3.0.0)中与持久性和查询相关的未捕获异常,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我已经为这个例外挣扎了一段时间了。firebase组中的一个相关线程有点死了,还有两个相关线程没有得到响应:和 解决办法是关闭数据库持久性,但对于需要离线功能的应用程序来说,这并不是不可接受的 我准备了一个最小活动示例,它在我的环境中再现了异常。这一切都归结为通过查询读取数据库。这足以启动和终止活动3次(奇怪),在第3次启动时,它将崩溃,出现以下一系列异常(我认为排队的查询越多,异常就越多): “分数”节点没有特定的安全设置:“分数”:{.read:true,.write:true}… 使用fi

我已经为这个例外挣扎了一段时间了。firebase组中的一个相关线程有点死了,还有两个相关线程没有得到响应:和

解决办法是关闭数据库持久性,但对于需要离线功能的应用程序来说,这并不是不可接受的

我准备了一个最小活动示例,它在我的环境中再现了异常。这一切都归结为通过查询读取数据库。这足以启动和终止活动3次(奇怪),在第3次启动时,它将崩溃,出现以下一系列异常(我认为排队的查询越多,异常就越多):

“分数”节点没有特定的安全设置:
“分数”:{.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'
}