我已经建立了一个实时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。我已经解决了为链接的问题提供的解决方案,但在我的情况下却没有解决(如上所述)。
答案 0 :(得分:1)
因为您需要告诉您的小部件在方向改变时保持原样。因此,您需要在<activity>
文件的AndroidManifest.xml
中放入一行:
<activity
android:name="NAME_OF_YOUR_ACTIVITY"
android:configChanges="keyboardHidden|orientation|screenSize" />