我正在创建我的第一个 Firebase 应用程序。它的要求之一是在网络不可用时运行。 Firebase 指南指出:
启用磁盘持久性允许我们的应用程序即使在应用程序重新启动后也能保留其所有状态。我们只需一行代码即可启用磁盘持久性。FirebaseDatabase.getInstance().setPersistenceEnabled(true);启用磁盘持久性后,我们的同步数据和写入将在应用程序重新启动时保留到磁盘,并且我们的应用程序应该可以在离线情况下无缝运行。
另一个要求是使用 Google 登录。所以在我的MainActivity
我检查用户是否已登录,如果没有,我启动SignInActivity
. (The SignInActivity
来自 Firebase 示例。)SignInActivity
工作,用户登录,并且MainActivity
第二次推出。现在我的应用程序在代码行崩溃FirebaseDatabase.getInstance().setPersistenceEnabled(true);
并显示以下消息:
必须在使用 FirebaseDatabase 实例之前调用 setPersistenceEnabled()。
现在,如果我重新启动我的应用程序,用户就会登录,SignInActivity
未启动,我的应用程序运行良好。
关于用户登录后如何避免此崩溃有什么建议吗?
当我发布这个问题时,我收到了搬迁的建议FirebaseDatabase.getInstance().setPersistenceEnabled(true);
到我的“应用程序类”。我得到了完全相同的结果......SignInActivity
开始,完成,然后我就崩溃了setPersistenceEnabled
.
以下是我的主要活动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();
}
}
FirebaseApp 是由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;
}
}
然后打电话Utils.getDatabase()
从您想要的任何活动中。
阅读本文的更多内容 https://firebase.googleblog.com/2016/12/how-does-firebase-initialize-on-android.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)