方向更改后永久性Firebase数据库崩溃

时间:2019-05-14 13:13:08

标签: android firebase-realtime-database persistence

我已经建立了一个实时Firebase-Database,它与正在构建的android应用程序进行了无故障通信...…直到我添加db.setPersistenceEnabled(true);db是实例化的全局FirebaseDatabase变量)并执行方向改变。

在研究StackOverflow和文档时,我看到了几种情况,通过使用if子句确保代码不会重试以解决此问题。但是即使安装了该应用程序,它也会崩溃。

我怀疑ValueEventListener在某种程度上发挥了作用。我试图在onStart()和onStop()中添加和删除侦听器,但这也无法防止崩溃。

这是我当前的代码版本(已删除所有上述试验,以免造成混淆):

    private FirebaseDatabase db;
    private DatabaseReference dbRef;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        db = FirebaseDatabase.getInstance();
            db.setPersistenceEnabled(true);
            isPersistenceEnabled = true;
        dbRef = db.getReference("meditations");
        dbRef.keepSynced(true);

        dbRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    meditations.clear();
                    List<String> keys = new ArrayList<>();

                    for (DataSnapshot keyNodes : dataSnapshot.getChildren()) {
                        keys.add(keyNodes.getKey());
                        Meditation meditation = keyNodes.getValue(Meditation.class);
                        meditations.add(meditation);
                        Log.v(getClass().getSimpleName(), "medtiation added");
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
    }

有人在这种情况下有经验吗?我在俯视什么吗?

ETA:为整个图片添加stacktrace(以防其他人遇到类似的问题):

2

019-05-14 15:29:31.175 16705-16705/com.example.android.meditationhub E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.android.meditationhub, PID: 16705
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.meditationhub/com.example.android.meditationhub.ui.MainActivity}: com.google.firebase.database.DatabaseException: Calls to setPersistenceEnabled() must be made before any other usage of FirebaseDatabase instance.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2724)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4621)
        at android.app.ActivityThread.-wrap19(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533)
        at android.os.Handler.dispatchMessage(Handler.java:110)
        at android.os.Looper.loop(Looper.java:203)
        at android.app.ActivityThread.main(ActivityThread.java:6251)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
     Caused by: com.google.firebase.database.DatabaseException: Calls to setPersistenceEnabled() must be made before any other usage of FirebaseDatabase instance.
        at com.google.firebase.database.FirebaseDatabase.assertUnfrozen(com.google.firebase:firebase-database@@17.0.0:316)
        at com.google.firebase.database.FirebaseDatabase.setPersistenceEnabled(com.google.firebase:firebase-database@@17.0.0:284)
        at com.example.android.meditationhub.ui.MainActivity.onCreate(MainActivity.java:46)
        at android.app.Activity.performCreate(Activity.java:6725)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2677)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789) 
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4621) 
        at android.app.ActivityThread.-wrap19(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533) 
        at android.os.Handler.dispatchMessage(Handler.java:110) 
        at android.os.Looper.loop(Looper.java:203) 
        at android.app.ActivityThread.main(ActivityThread.java:6251) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 

ETA2:我看到它已被标记为duplicate question。我已经解决了为链接的问题提供的解决方案,但在我的情况下却没有解决(如上所述)。

1 个答案:

答案 0 :(得分:1)

因为您需要告诉您的小部件在方向改变时保持原样。因此,您需要在<activity>文件的AndroidManifest.xml中放入一行:

<activity
        android:name="NAME_OF_YOUR_ACTIVITY"
        android:configChanges="keyboardHidden|orientation|screenSize" />