2017-07-18 91 views
0

Android Vitals收集的新故障部分和ANR之后,启用persistence后,我有几个IllegalStateExceptionfirebase databaseIllegalStateException在启用Firebase数据库中的持久性时

public class Configuration extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     if(!FirebaseApp.getApps(this).isEmpty()) { 
      FirebaseDatabase.getInstance().setPersistenceEnable(true); 
     } 
    } 

} 

例外:

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年2月3日

根据@Frank面包车Puffelen的我创造了这个answer的建议,但仍然出现问题。

enter image description here

今天9:14应用版本27 LGE LG K8(mm1v),1536MB内存,安卓6.0 报告1

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:5551)  
    at java.lang.reflect.Method.invoke (Method.java)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:731)  
    at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:621) 
Caused by: java.lang.IllegalStateException:  
    at com.google.firebase.FirebaseApp.getInstance (FirebaseApp.java)  
    at com.google.firebase.database.FirebaseDatabase.getInstance (FirebaseDatabase.java) 
    or      .setPersistenceEnabled (FirebaseDatabase.java) 
    or      .zzph (FirebaseDatabase.java)  
    at myapp.MyActivity.<init> (MyActivity.java)  
    at java.lang.Class.newInstance (Class.java)  
    at android.app.Instrumentation.newActivity (Instrumentation.java:1068)  
    at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2329)  
    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:5551)  
    at java.lang.reflect.Method.invoke (Method.java)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:731) 
    at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:621) 
+2

参见[火力地堡的数据库持久不工作#15](https://github.com/firebase/quickstart-android/issues/15) –

+0

搜索您的代码其他对'setPersistenceEnable()'的调用。如果崩溃是'Configuration.onCreate()'中调用的结果,那么我希望看到堆栈跟踪中与创建应用程序相关的行,例如'android.app.Instrumentation.callApplicationOnCreate'。相反,有一些行提示系统正在尝试创建“MyActivity”实例。 –

+0

@языкK - 我已经从应用程序类中删除了代码并使用了解决方案的建议代码,但它没有解决问题,它仍然生成错误日志。 – k4k4sh1

回答

0

为了解决这个问题,请使用代码如下:

private static boolean calledAlready = false; 
if (!calledAlready) { 
    FirebaseDatabase.getInstance().setPersistenceEnabled(true); 
    calledAlready = true; 
} 

您需要使用此代码作为您的onCreate方法的第一个代码。在这种情况下,setPersistenceEnabled()方法只会在以前未被调用时调用,因为存在calledAlready布尔值。

希望它有帮助。

+1

最有可能的问题是由一个多进程的应用程序引起的,这是K链接到的东西。在这种情况下,这个代码不会有帮助,因为静态布尔值链接到单个流程实例。内容提供者是唯一适当的解决方案,除了在你的主要活动中调用'setPersistenceEnabled(true)'(这意味着它被多次调用,但没关系)。 –

1
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>