离开Android应用程序时关闭Firebase数据库连接
我制作了一个Android应用程序,它可以从中接收实时数据。在我的主要活动中,用户必须使用电子邮件和密码登录,如果成功,它将打开一个新活动,接收数据 看起来,当用户离开我的应用程序时,Firebase连接仍然建立。这对电池不好离开Android应用程序时关闭Firebase数据库连接,android,firebase,database-connection,firebase-realtime-database,activity-lifecycle,Android,Firebase,Database Connection,Firebase Realtime Database,Activity Lifecycle,我制作了一个Android应用程序,它可以从中接收实时数据。在我的主要活动中,用户必须使用电子邮件和密码登录,如果成功,它将打开一个新活动,接收数据 看起来,当用户离开我的应用程序时,Firebase连接仍然建立。这对电池不好 如何管理关闭和重新打开应用程序的连接?我想我需要使用onPause()和onResume()。我找到了类似于goOffline(),但在新Firebase中找不到此方法。是的,您可以使用活动生命周期方法,如onPause(),onStop()ononDestroy()来关
如何管理关闭和重新打开应用程序的连接?我想我需要使用
onPause()
和onResume()
。我找到了类似于goOffline()
,但在新Firebase中找不到此方法。是的,您可以使用活动生命周期方法,如onPause()
,onStop()
ononDestroy()
来关闭连接
此外,Firebase似乎仍然有一个
goOffline()
方法-。使用goOffline()
和goOnLine()
方法的替代方法是删除ValueEventListeners
和ChildEventListeners
。我的经验(仅适用于SDK 3.X)是Firebase将在大约1分钟后自动断开连接,当时没有注册侦听器,也没有其他连接原因,例如挂起的写入。我最近将Firebase数据库添加到我的应用程序中,但偶尔会注意到电池使用率高,它似乎链接到我的应用程序,保持收音机处于活动状态(10小时内收音机处于活动状态1小时30分钟,但应用程序使用约5分钟)
我相信这是链接到Firebase数据库的,因为我已经禁用了应用内购买广播接收器,这是唯一的其他网络元素。我没有任何打开的侦听器(我使用的是单值事件),但有些事务是可变的,因此其中一个事务可能无法完成,并定期重新尝试。数据库持久性已关闭
我目前正在测试以下对暂停/恢复的简单添加(在答案中获得一些代码:-):
到目前为止,一切顺利。**需要注意的主要事项是切换活动,这要求您在使用Firebase的每个应用程序中都有此功能(我有一个登录活动,它在从数据库读取用户名时停止工作)**
2016年5月12日-测试两周后更新。昨天又出现了高电池使用率。我主要是在棒棒糖上测试,有很多人抱怨收音机被其他应用程序打开了。其他人在安卓M上测试我的应用程序时没有报告任何问题,所以可能是棒棒糖问题。我将继续测试,这次尝试删除不必要的事务,看看这是否有帮助。。。希望这对某人有所帮助。是的,但这似乎只适用于“旧”firebase。我只有FirebaseApp类(com.google.firebase),没有.goOffline()。最新的firebase SDK中也存在同样的方法:@DenisBanach,我对此表示怀疑。否则Firebase会重组他们的文档以反映这一变化。啊,好的,谢谢,现在我找到了。但它在另一个类中:FirebaseDatabase.getInstance().getReference(“Time”).goOffline();在旧的SDK中,它是Firebase.goOffline(),正如我所理解的那样。@DenisBanach:我很想知道您更改的结果。事实上,当我上次测试它们时,我得到了不同的结果。如果你能对这个问题留下评论,我将不胜感激。对这个问题的一个更新-只是注意到我在前面使用持久化和胖手指时引用了数据库静态。。。如果(mFirebaseDatabase==null){FirebaseDatabase.getInstance().setPersistenceEnabled(true);mFirebaseDatabase=FirebaseDatabase.getInstance();}我想知道引用是否是静态的,那么数据库连接会自动关闭。因此,可能只有在使用静态引用时才需要goOffline()/goOnline()。如果我得到一个明确的答案,我会更新。。。必须学习如何使用堆栈流。道歉4天后,没有电池问题,所以我相信我的问题是通过消除数据库引用上的静电解决的
@Override
protected void onResume()
{
super.onResume();
if (FirebaseDatabase.getInstance() != null)
{
FirebaseDatabase.getInstance().goOnline();
}
}
@Override
public void onPause() {
super.onPause();
if(FirebaseDatabase.getInstance()!=null)
{
FirebaseDatabase.getInstance().goOffline();
}
}