Android Firebase数据库中启用持久性的IllegalStateException
在从Android Vitals收集了新的失败和ANR部分之后,我在enable persistence上发现了几个关于firebase数据库的非法状态异常 例外情况:Android Firebase数据库中启用持久性的IllegalStateException,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,在从Android Vitals收集了新的失败和ANR部分之后,我在enable persistence上发现了几个关于firebase数据库的非法状态异常 例外情况: java.lang.RuntimeException: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339) at android.app.ActivityThread.handleLaunchActivity(Act
java.lang.RuntimeException:
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
at android.app.ActivityThread.access$900(ActivityThread.java:157)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5530)
at java.lang.reflect.Method.invoke(Method.java:0)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:733)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:623)
Caused by: java.lang.IllegalStateException:
at com.google.firebase.FirebaseApp.getInstance(FirebaseApp.java:0)
at com.google.firebase.database.FirebaseDatabase.getInstance(FirebaseDatabase.java:0)
at <OR>.getInstance(FirebaseDatabase.java:0)
at <OR>.setPersistenceEnabled(FirebaseDatabase.java:0)
at <OR>.zziE(FirebaseDatabase.java:0)
at myapp.MyActivity.<init>(MyActivity.java:0)
at java.lang.Class.newInstance(Class.java:0)
at android.app.Instrumentation.newActivity(Instrumentation.java:1068)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2329)
更新日期:2018年3月2日
根据@Frank van Puffelen的建议,我创建了这个,但问题仍然存在
今天上午9:14,应用程序版本27
LGE LG K8 mm1v、1536MB内存、安卓6.0
报告1
要解决此问题,请使用以下代码:
private static boolean calledAlready = false;
if (!calledAlready) {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
calledAlready = true;
}
您需要将此代码用作onCreate方法的第一个代码。在这种情况下,setPersistenceEnabled方法只有在之前没有调用时才会被调用,因为存在CalledReady boolean
希望能有帮助
public class FirebaseContentProvider extends ContentProvider {
private static FirebaseDatabase mDatabase;
@Override
public boolean onCreate() {
if (mDatabase == null) {
mDatabase = FirebaseDatabase.getInstance();
mDatabase.setPersistenceEnabled(true);
}
return true;
}
}
AndroidManifest.xml
<application
... >
<provider
android:name=".test.FirebaseContentProvider"
android:authorities="com.test.FirebaseContentProvider"
android:exported="false" />
</application>
请参阅搜索代码以查找对setPersistenceEnable的其他调用。如果崩溃是Configuration.onCreate中调用的结果,我希望在堆栈跟踪中看到与应用程序创建相关的行,例如android.app.Instrumentation.callapplicationncreate。相反,有几行代码表明系统正在尝试创建MyActivity的实例。@ρцσѕρєK-我已经从应用程序类中删除了代码,并使用了建议的代码来解决问题,但它没有解决问题,它仍然会生成错误日志。@Bob Snyder-正如Frank van Puffelen所引用的,错误是由于我的应用程序是多进程的。问题很可能是由多进程应用程序引起的,该应用程序是@ρцσѕρєK链接的。在这种情况下,这段代码没有帮助,因为静态布尔值链接到单个流程实例。除了在主活动中简单地调用setPersistenceEnabledtrue(这意味着它会被多次调用)之外,内容提供者是唯一合适的解决方案,但这并不重要。
public class FirebaseContentProvider extends ContentProvider {
private static FirebaseDatabase mDatabase;
@Override
public boolean onCreate() {
if (mDatabase == null) {
mDatabase = FirebaseDatabase.getInstance();
mDatabase.setPersistenceEnabled(true);
}
return true;
}
}
<application
... >
<provider
android:name=".test.FirebaseContentProvider"
android:authorities="com.test.FirebaseContentProvider"
android:exported="false" />
</application>