我有一个应用程序,当用户的帖子被喜欢时,我希望用户收到通知。
我可以使用ChildValueEventListener
,但这太快了。
我不希望用户每次受到通知时都会受到轰炸。发生。因为如果另一个用户经常保持喜欢'并且“不喜欢'一篇文章,帖子作者用户将被通知轰炸。
我的计划是在Runnable / Handler中运行SingleValueEventListener
并每隔20秒检查一次通知。如下所示:
Handler handler = new Handler();
int delay = 20000; // 20 seconds
handler.postDelayed(new Runnable(){
public void run(){
databaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild("USER_NOTIFICATION") {
// new notification exists - alert user
}
handler.postDelayed(this, delay);
}
}, delay);
我有两个问题。 1)这样做可以吗?我的意思是,每隔x秒获取一次数据是否昂贵? 2)可以在Service
内运行那段代码,这样即使应用程序关闭或被杀,用户仍然可以收到通知吗?
答案 0 :(得分:3)
你一气呵成地否定了Firebase数据库的最大优势(实时更新),并重新引入了它解决的一个大缺点(每次你现在都会下载所有数据,而不是只进行增量更新)。
您可能最好限制在客户端代码中限制您向用户显示的更改数量。因此,请使用常规ChildValueEventListener
并简单地限制客户端上的更新。
E.g。
public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
if (System.currentTimeMillis() - lastShownTimestamp > 20000) {
// TODO: show latest data on screen
lastShownTimestamp = System.currentTimeMillis();
}
}