【发布时间】:2023-03-23 13:27:01
【问题描述】:
我已经设置了一个实时 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:为全图添加堆栈跟踪(以防其他人遇到类似问题):
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。我已经查看了为链接问题提供的解决方案,但在我的情况下没有一个解决方案(如上所述)。
【问题讨论】:
-
尝试在你的
<activity>android:configChanges="keyboardHidden|orientation|screenSize"中添加清单文件。 -
考虑使用
LiveData来防止配置更改期间的数据丢失。实时数据适用于 firebase。 (我在我的应用中使用) -
谢谢,@NickBapu,成功了。我没想到那里看。你想弹出答案让我接受吗?
-
@Abhi,谢谢。我暂时删除了 LiveData 以弄清楚为什么会这样。我会重新应用它,现在它又可以工作了。
-
@AlexMamo。感谢您的提醒。我正要这样做,但尼克·巴普(Nick Bapu)立即指出了我忽略的内容,从而击败了我。
标签: android firebase-realtime-database persistence