【发布时间】:2016-09-23 17:02:36
【问题描述】:
我正在创建我的第一个 Firebase 应用。它的要求之一是它在网络不可用时运行。 Firebase 指南指出:
启用磁盘持久性使我们的应用即使在应用重新启动后也能保持其所有状态。我们只需一行代码就可以启用磁盘持久性。 FirebaseDatabase.getInstance().setPersistenceEnabled(true); 启用磁盘持久性后,我们同步的数据和写入将在应用重新启动时持久保存到磁盘,并且我们的应用应该在离线情况下无缝运行。
另一个要求是使用 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();
}
}
【问题讨论】:
标签: firebase firebase-realtime-database firebase-authentication