Firebase setPersistenceEnabled(true)崩溃应用程序
我正在创建我的第一个Firebase应用程序。它的一个要求是在网络不可用时运行。Firebase指南规定: 启用磁盘持久性允许我们的应用程序即使在重新启动应用程序后也保持其所有状态。我们只需一行代码就可以实现磁盘持久性。 FirebaseDatabase.getInstance().setPersistenceEnabled(true)强> 启用磁盘持久性后,我们的同步数据和写入将在应用程序重新启动时持久化到磁盘,并且我们的应用程序应在脱机情况下无缝工作 另一个要求是使用谷歌登录。因此,在我的Firebase setPersistenceEnabled(true)崩溃应用程序,firebase,firebase-realtime-database,firebase-authentication,Firebase,Firebase Realtime Database,Firebase Authentication,我正在创建我的第一个Firebase应用程序。它的一个要求是在网络不可用时运行。Firebase指南规定: 启用磁盘持久性允许我们的应用程序即使在重新启动应用程序后也保持其所有状态。我们只需一行代码就可以实现磁盘持久性。 FirebaseDatabase.getInstance().setPersistenceEnabled(true) 启用磁盘持久性后,我们的同步数据和写入将在应用程序重新启动时持久化到磁盘,并且我们的应用程序应在脱机情况下无缝工作 另一个要求是使用谷歌登录。因此,在我的mai
main活动中
检查用户是否已登录,如果未登录,则启动signianctivity
。(SignInActivity
来自Firebase示例。)SignInActivity
工作,用户登录,MainActivity
第二次启动。现在,我的应用程序在代码行FirebaseDatabase.getInstance().setPersistenceEnabled(true)上崩溃代码>显示以下消息:
必须先调用setPersistenceEnabled(),然后才能使用FirebaseDatabase实例
现在,如果我重新启动我的应用程序,用户已登录,SignInActivity
未启动,我的应用程序运行正常
在用户登录后,有没有关于如何避免此崩溃的建议
在我发布这个问题时,我收到了重新定位FirebaseDatabase.getInstance().setPersistenceEnabled(true)的建议代码>
去我的“应用课”。我得到了完全相同的结果…signianctivity
启动、完成,然后在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();
}
}
我也面临一些问题,但这是我的应用程序的临时解决方案
Create BaseActivity扩展AppCompative并重写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();
}
}
}
并将MainActivity更改为扩展BaseActivity
public class MainActivity extends BaseActivity
编辑:关注@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();
}
}
}
我面临着一个类似的问题,使用静态变量似乎可以解决这个问题。所以一开始我的代码是这样的
@Override
protected void onCreate(Bundle savedInstanceState) {
//..code
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
FirebaseDatabase database = FirebaseDatabase.getInstance();
//..code
}
现在看起来更像
static boolean calledAlready = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
//..code
if (!calledAlready)
{
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
calledAlready = true;
}
FirebaseDatabase database = FirebaseDatabase.getInstance();
//..code
}
希望有帮助 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;
}
}
public class MainActivity extends AppCompatActivity
private static FirebaseDatabase fbDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
if(fbDatabase == null) {
fbDatabase = FirebaseDatabase.getInstance();
fbDatabase.setPersistenceEnabled(true);
}
public class DataBaseUtil {
private static FirebaseDatabase mDatabase;
public static FirebaseDatabase getDatabase() {
if (mDatabase == null) {
mDatabase = FirebaseDatabase.getInstance();
mDatabase.setPersistenceEnabled(true);
}
return mDatabase;
}}
然后从任何需要的活动调用Utils.getDatabase()
通过将Firebase引用设置为静态类字段来解决此问题,如下所示:
public class Utils {
private static FirebaseDatabase mDatabase;
public static FirebaseDatabase getDatabase() {
if (mDatabase == null) {
mDatabase = FirebaseDatabase.getInstance();
mDatabase.setPersistenceEnabled(true);
}
return mDatabase;
}
}
public class MainActivity extends AppCompatActivity
private static FirebaseDatabase fbDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
if(fbDatabase == null) {
fbDatabase = FirebaseDatabase.getInstance();
fbDatabase.setPersistenceEnabled(true);
}
public class DataBaseUtil {
private static FirebaseDatabase mDatabase;
public static FirebaseDatabase getDatabase() {
if (mDatabase == null) {
mDatabase = FirebaseDatabase.getInstance();
mDatabase.setPersistenceEnabled(true);
}
return mDatabase;
}}
在其他活动中创建新的Firebase引用(没有setPersistenceEnabled(true))也没有问题。我也面临同样的问题。我更改代码如下
之前(导致碰撞)
之后(已解决崩溃)
我通过在我的应用程序
类中使用setPersistenceEnabled(true)
修复了此异常
public class MApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
}
在AndroidManifest.xml中,将应用程序名称设置为MapApplication:
<application
android:name=".MApplication"
... />
我有点晚了,但今天我遇到了这个问题,我通过添加
static {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
对于我的活动如果您不喜欢静态字段,这对我来说很有用:
if (FirebaseApp.getApps(context).isEmpty()) {
FirebaseApp.initializeApp(context);
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
这可能是由多个进程两次初始化firebase或Multidex应用程序引起的。有关更多信息,请参见:错误消息描述了问题:
必须先调用setPersistenceEnabled(),然后才能进行任何其他使用
FirebaseDatabase实例的
文档中描述了此问题的修复方法:与SDK 2.x中一样,在对数据库进行其他调用之前,必须启用磁盘的持久性。
FirebaseDatabase.getInstance().setPersistenceEnabled(true)代码>
对我来说,为Firebase创建单独的类更容易处理。这是因为Firebase有它自己的实例,如果您在多个活动中使用它,如果您在另一个活动中再次调用setPersistenceEnabled,它可能会崩溃
另一个好处是,如果需要,可以将上下文或参数传递到FirebaseHandler构造函数中。或者,如果您在数据库中有固定的位置,则可以在不使用.child(“位置”)样板的情况下将其称为easy
例如:
公共类FirebaseHandler{
//参数
私人语境;
私有字符串用户密钥;
私有数据库参考数据库参考;
私有静态布尔值isPersistenceEnabled=false;
私有静态字符串fixedLocationA=“locationA”;
私有静态字符串fixedLocationB=“locationB”;
公共FirebaseHandler(上下文,字符串userKey){
this.context=context;//context可用于调用PreferenceManager等。
this.userKey=userKey;
如果(!isPersistenceEnabled){
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
isPersistenceEnabled=真;
}
databaseReference=FirebaseDatabase.getInstance().getReference().child(userKey);
}
公共数据库引用getRefA(){
返回databaseReference.child(fixedLocationA);
}
公共数据库引用getRefB(){
返回databaseReference.child(fixedLocationB);
}
}
然后可以在下面的任何活动中调用该函数
公共类MyActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//获取实例
FirebaseHandler FirebaseHandler=新的FirebaseHander(此“用户密钥”);
//定值
firebaseHandler.getRefA().setValue(“值”);
//设置侦听器
firebaseHandler.getRefB().addValueEventListener(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
//这里的待办事项。。。。
/
public class AppName extends Application {
@Override
public void onCreate() {
super.onCreate();
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
public class DataBaseUtil {
private static FirebaseDatabase mDatabase;
public static FirebaseDatabase getDatabase() {
if (mDatabase == null) {
mDatabase = FirebaseDatabase.getInstance();
mDatabase.setPersistenceEnabled(true);
}
return mDatabase;
}}
private FirebaseDatabase fdb = DataBaseUtil.getDatabase();
public class Util {
private static FirebaseDatabase mData;
public static FirebaseDatabase getDatabase() {
if (mData == null) {
mData = FirebaseDatabase.getInstance();
mData.setPersistenceEnabled(true);
}
return mData;
}
}
class DatabaseUtil {
companion object {
private val firebaseDatabase: FirebaseDatabase = FirebaseDatabase.getInstance()
init {
firebaseDatabase.setPersistenceEnabled(true)
}
fun getDatabase() : FirebaseDatabase {
return firebaseDatabase
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
....
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_home, container, false);