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()从您想要的任何活动打电话.
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)
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)
到我的活动
我也面临一些问题,但这是我的应用程序的临时解决方案。
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)
| 归档时间: |
|
| 查看次数: |
22598 次 |
| 最近记录: |