【发布时间】:2018-02-13 19:35:31
【问题描述】:
我在强制从 Firebase 实时数据库读取值时遇到问题。我的申请流程:
SplashActivity->LoginActivity->MainActivity。当用户登录时,SplashActivity 和 LoginActivity 不存在。当用户注销时,主要活动完成并再次创建 LoginActivity。
在 MainActivity onCreate 事件中,从 Firebase 中检索有趣的数据:
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("appVariant");
myRef.child("stable").addListenerForSingleValueEvent(new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
AppVariant v = dataSnapshot.getValue(AppVariant.class);
Log.d(BuildConfig.APPLICATION_ID, String.format("Data change: %s", v.toString()));
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
它工作正常,但只是第一次创建MainActivity。如果我注销(所以 MainActivity 已完成),然后再次登录(MainActivity 重新创建),onDataChanged 永远不会再次触发。
如何在不重新启动应用程序的情况下强制再次获取子值?我需要按需检索数据,每次用户登录后,一次(无需监控任何更改)。这可能吗?
【问题讨论】:
-
如果您需要在每次用户登录时加载一次相同的数据,则需要在每次用户登录时附加相同的监听器。
-
你的意思是监听器不应该被重新创建,它应该存在于活动生命周期之外吗?
-
我认为您误解了 Activity 触发的生命周期方法。
onCreate仅在最初创建活动时触发。如果要在每次激活活动时加载数据,请将代码放入onStart()或onResume()。请参阅developer.android.com/guide/components/activities/… 以获得良好的图表 -
你错了。我已经调试过了,我确定
addListenerForSingleValueEvent被再次调用,但不是onDataChange。请注意,在注销时,MainActivity完成(通过调用fhinish方法)并启动新的 LoginActiviwy 实例。然后,在用户登录后,LoginActivity启动新的MainActivity实例,所以onCreate将再次被触发。 -
在这种情况下,您可能会收到“权限被拒绝”。实施
onCancelled来捕捉它,例如public void onCancelled(DatabaseError databaseError) { throw databaseError.toException(); }
标签: java android firebase firebase-realtime-database