setPersistenceEnabled(true)崩溃应用程序

Lor*_*ren 35 firebase firebase-authentication firebase-realtime-database

我正在创建我的第一个Firebase应用程序.它的一个要求是它在网络不可用时运行.Firebase指南指出:

启用磁盘持久性使我们的应用程序即使在应用程序重新启动后也能保持其所有状态.我们只需一行代码即可启用磁盘持久性. FirebaseDatabase.getInstance()setPersistenceEnabled(真). 启用磁盘持久性后,我们的同步数据和写入将在应用程序重新启动后持久保存到磁盘,我们的应用程序应在脱机情况下无缝工作.

另一个要求是使用Google登录.所以在我MainActivity检查用户是否已登录时,如果没有,我启动了SignInActivity.( SignInActivity来自Firebase示例.)SignInActivity工作,用户登录,并MainActivity再次启动.现在我的应用程序在代码行崩溃,FirebaseDatabase.getInstance().setPersistenceEnabled(true); 并显示以下消息:

必须在FirebaseDatabase实例的任何其他使用之前调用setPersistenceEnabled().

现在,如果我重新启动我的应用程序,用户已登录,SignInActivity未启动,我的应用运行正常.

用户登录后如何避免此崩溃的任何建议?

当我发布这个问题时,我收到了一个重新安置FirebaseDatabase.getInstance().setPersistenceEnabled(true); 到我的"应用程序类"的建议.我得到完全相同的结果...... SignInActivity开始,完成,然后我就崩溃了setPersistenceEnabled.

以下是我的MainActivity onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Calls to setPersistenceEnabled() must be made before any other usage of FirebaseDatabase instance.
    // Crash here upon returning from SignInActivity.  
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    mFirebaseDbReference = FirebaseDatabase.getInstance().getReference();

    // Initialize Firebase Auth
    mFirebaseAuth = FirebaseAuth.getInstance();
    mFirebaseUser = mFirebaseAuth.getCurrentUser();
    if (mFirebaseUser == null) {
        // Not signed in, launch the Sign In activity
        Timber.tag("MainActivity").i("onCreate(): User not signed in, launching SignInActivity");
        startActivity(new Intent(this, SignInActivity.class));
        finish();

    } else {
        mUsername = mFirebaseUser.getDisplayName();
        Timber.tag("MainActivity").i("onCreate(): User \"%s\" signed in.", mUsername);
        if (mFirebaseUser.getPhotoUrl() != null) {
            mPhotoUrl = mFirebaseUser.getPhotoUrl().toString();
        }
    } 
Run Code Online (Sandbox Code Playgroud)

Dan*_*anu 52

FirebaseApp由a初始化,ContentProvider因此在onCreate()调用时未初始化.

像这样获取您的FirebaseDatabase:

public class Utils {
    private static FirebaseDatabase mDatabase;

    public static FirebaseDatabase getDatabase() {
       if (mDatabase == null) {
          mDatabase = FirebaseDatabase.getInstance();
          mDatabase.setPersistenceEnabled(true);
       }
       return mDatabase;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后Utils.getDatabase()从您想要的任何活动打电话.

阅读本文的更多内容

  • 我想你从这里拿走了这个...... https://github.com/firebase/quickstart-android/issues/15 (3认同)

dkn*_*ris 47

我通过setPersistenceEnabled(true)在我的Application课程中使用来修复此异常.

public class MApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

在AndroidManifest.xml中,将应用程序名称设置为MApplication:

<application
    android:name=".MApplication"
    ... />
Run Code Online (Sandbox Code Playgroud)

  • 这是正确答案,应标记为已接受. (4认同)
  • 并且不要忘记添加清单文件:D (2认同)

ima*_*pps 25

我遇到了类似的问题,使用静态变量似乎解决了我的问题.所以起初我的代码看起来像这样

@Override
protected void onCreate(Bundle savedInstanceState) {
    //..code

    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    FirebaseDatabase database = FirebaseDatabase.getInstance();

    //..code
}
Run Code Online (Sandbox Code Playgroud)

现在它看起来更像

static boolean calledAlready = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    //..code

    if (!calledAlready)
    {
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
        calledAlready = true;
    }

    FirebaseDatabase database = FirebaseDatabase.getInstance();

    //..code
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!


rkm*_*max 17

我有点晚了,但今天我遇到了这个问题,我解决了这个问题

static {
    FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

到我的活动


Suc*_*pto 1

我也面临一些问题,但这是我的应用程序的临时解决方案。

Create BaseActivity 扩展了 AppcompatActivity 并覆盖 onCreate,放在setPersistenceEnabled那里。

public class BaseActivity extends AppCompatActivity {

    private static String TAG = "BaseActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try{
            FirebaseDatabase.getInstance().setPersistenceEnabled(true);
            Log.d(TAG,FirebaseDatabase.getInstance().toString());
        }catch (Exception e){
            Log.w(TAG,"SetPresistenceEnabled:Fail"+FirebaseDatabase.getInstance().toString());
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并更改MainActivity以扩展BaseActivity

public class MainActivity extends BaseActivity
Run Code Online (Sandbox Code Playgroud)

编辑: 遵循@imakeApps 答案

public class BaseActivity extends AppCompatActivity {

    private static String TAG = "BaseActivity";

    static boolean isInitialized = false;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try{
            if(!isInitialized){
                FirebaseDatabase.getInstance().setPersistenceEnabled(true);
                isInitialized = true;
            }else {
                Log.d(TAG,"Already Initialized");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)