我遇到了从Firebase Realtime数据库强制读取值的问题。我的申请流程:
SplashActivity-> LoginActivity-> MainActivity。记录用户时,SplashActivity和LoginActivity不存在。当用户注销时,主活动完成并再次创建LoginActivity。
在MainActivity var xmlString = @"<person xmlns-json='http://james.newtonking.com/projects/json' id='1'><name>Alan</name><url>http://www.google.com</url><role json-Array='true'>Admin</role></person>";
var xml = new XmlDocument();
xml.LoadXml(xmlString);
var json = JsonConvert.SerializeXmlNode(xml);
var xmlDeserialized = JsonConvert.DeserializeXmlNode(json);
xmlDeserialized.Should().NotBeNull();
xmlDeserialized.ShouldBeEquivalentTo(xml); //All good
事件中,要从Firebase检索有趣的数据:
onCreate
它工作正常,但只是第一次创建 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
永远不会再次触发。
如何强制再次获取子值,而无需重新启动应用程序?每次用户登录后,我都需要按需检索数据一次(不需要监视任何更改)。这可能吗?
答案 0 :(得分:1)
这不是身份验证过程的正常流程。如果您有两个不同的活动(让我们省略SplashActivity),例如LoginActivity
和MainActivity
,您应该考虑执行以下操作:
AndroidManifest.xml
文件中启动的默认活动authStateListener
以检查用户身份验证的状态。如果firebaseUser != null
,则将用户重定向到MainActivity。authStateListener
以检查用户身份验证的状态。如果firebaseUser == null
,则将用户重定向到LoginActivity。通过身份验证后,您可以使用侦听器而不必担心您的活动会重新启动。
就是这样。为了更好地理解,如果您有时间,请查看我已逐步解释的tutorials之一,所有身份验证过程都使用两种不同的活动。