【问题标题】:Android Firebase - setPersistenceEnabled(true) crashing the appAndroid Firebase - setPersistenceEnabled(true) 使应用程序崩溃
【发布时间】:2016-12-20 20:10:42
【问题描述】:

所以我只是尝试使用 Firebase 从实时数据库中更新活动的工具栏标签。我收到以下错误:

12-21 00:25:19.890 10295-10295/com.xlr8labs.FirebaseAuth E/AndroidRuntime: FATAL EXCEPTION: main
                                                                       Process: com.xlr8labs.FirebaseAuth, PID: 10295
                                                                       java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xlr8labs.FirebaseAuth/com.xlr8labs.FirebaseAuth.RegisterActivity}: 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:2341)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2393)
                                                                           at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1324)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:110)
                                                                           at android.os.Looper.loop(Looper.java:193)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5295)
                                                                           at java.lang.reflect.Method.invokeNative(Native Method)
                                                                           at java.lang.reflect.Method.invoke(Method.java:515)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
                                                                           at dalvik.system.NativeStart.main(Native Method)
                                                                        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.zzhM(Unknown Source)
                                                                           at com.google.firebase.database.FirebaseDatabase.setPersistenceEnabled(Unknown Source)
                                                                           at com.xlr8labs.FirebaseAuth.RegisterActivity.onCreate(RegisterActivity.java:35)
                                                                           at android.app.Activity.performCreate(Activity.java:5264)
                                                                           at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2393) 
                                                                           at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1324) 
                                                                           at android.os.Handler.dispatchMessage(Handler.java:110) 
                                                                           at android.os.Looper.loop(Looper.java:193) 
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5295) 
                                                                           at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                           at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828) 
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644) 
                                                                           at dalvik.system.NativeStart.main(Native Method) 

即使我在调用我的数据库实例上的任何其他方法之前使用 setPersistenceEnabled(),我仍然收到此错误。这是我的 Activity.java 代码:

public class RegisterActivity extends AppCompatActivity {
 private FirebaseDatabase mFirebaseInstance;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        // ------------------ Update activity label from database in realtime ------
        mFirebaseInstance = FirebaseDatabase.getInstance();
        mFirebaseInstance.setPersistenceEnabled(true);
        mFirebaseInstance.getReference("RegisterLabel").keepSynced(true);
        mFirebaseInstance.getReference("RegisterLabel").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Log.e(LOG_TAG,"Register label changed");
                String appTitle = dataSnapshot.getValue().toString();
                getSupportActionBar().setTitle(appTitle);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        // ---------------------------------------------------------------------------

是什么导致了崩溃。我在另外两个活动中使用完全相同的 sn-p...

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    这部分mFirebaseInstance.setPersistenceEnabled(true); 应该只是在第一个活动中。不应多次调用它。

    更好的解决方案是将该行放在 Application 类的 onCreate 方法中。你可以阅读更多关于它的信息here

    【讨论】:

    • 嗨!感谢您的回答,但现在我仍然在这一行收到 NullPointer 异常:mFirebaseInstance = FirebaseDatabase.getInstance();
    • 你能粘贴堆栈跟踪吗?那不应该发生。
    • 清理和重建项目后。我让它工作。谢谢! :)
    • 更好的办法是把它放在一个 ContentProvider 中,保证一个应用程序只有一个(即使应用程序最终产生多个进程)。见developer.android.com/reference/android/content/…
    【解决方案2】:

    RegisterActivity 类中删除mFirebaseInstance.setPersistenceEnabled(true); 行。

    创建一个应该扩展 Application 的自定义类并将其写入那里。

    例子:

    public class JustExample extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            if (!FirebaseApp.getApps(this).isEmpty())
            {
                FirebaseDatabase.getInstance().setPersistenceEnabled(true);
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。你能告诉我如何使用这个类调用数据库实例吗?
    • 如何在我的 RegisterActivity 中使用它?
    • 不,您不需要在 RegisterActivity 中使用它。相反,您可以创建一个新的 java 文件
    • 您的意思是只创建新的 java 文件而不更改 RegisterActivity?
    • 是的,别忘了从 RegisterActivity 中删除该行
    【解决方案3】:
    boolean flag = true; //before onCreate() method
    
    //inside onStart() Method
    if(flag)
    { 
      firebaseDatabase.setPersistenceEnabled(true);
      flag = false;
    }
    

    【讨论】:

    • 虽然这可能会回答问题,但也请添加简短说明您的代码实际做了什么以及为什么它解决了最初的问题。
    【解决方案4】:

    您可以使用模型类并在其中使用方法,例如下面提到的。

    public class DatabaseUtility {
    
        private static FirebaseDatabase database;
    
        public static FirebaseDatabase getDatabase(){
            if(database==null){
                database=FirebaseDatabase.getInstance();
                database.setPersistenceEnabled(true);
            }
            return database;
        }
    }
    

    这将返回数据库实例,您可以使用database.getReference(); 方法获取 Root 引用。如果数据库对象已经存在,这也将节省一些时间。

    【讨论】:

      【解决方案5】:

      您只需卸载之前安装的应用程序即可。让它安装新的应用程序。它会解决问题。

      【讨论】:

        猜你喜欢
        • 2016-09-23
        • 2018-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多