在runnable中获取firebase数据

时间:2018-03-16 03:10:33

标签: java android firebase firebase-realtime-database

我有一个应用程序,当用户的帖子被喜欢时,我希望用户收到通知。 我可以使用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内运行那段代码,这样即使应用程序关闭或被杀,用户仍然可以收到通知吗?

1 个答案:

答案 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();
  }
}