【问题标题】:Android Firebase keep addListenerForSingleValueEvent updated [duplicate]Android Firebase保持addListenerForSingleValueEvent更新[重复]
【发布时间】:2018-08-11 14:09:11
【问题描述】:

我正在尝试使用 firebase 进行搜索查询,效果非常好。

Query searchQuery = usersRef.orderByChild(child).startAt(text).endAt(text + "\uf8ff").limitToFirst(limit);
    searchQuery.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            //search result logic
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });

我启用了离线功能,因为在我的应用程序中需要它们,这是我的问题:这个 ValueEventListener 一直在监听本地存储的数据,而我需要让它始终保持更新......这是一个搜索查询。

我认为将 keepSynced(true) 应用于用户引用不是一个好主意,因为这个引用很大,这会导致大量互联网和内存浪费。

我在网络上表示使用 addValueEventListener 而不是 addListenerForSingleValueEvent 查询将始终从服务器接收更新的答案,而无需查看本地存储的数据。 这可能是解决我的问题的一种方法,但我需要侦听一次数据,这将继续侦听数据,所以如果我决定使用它,我应该停止这个侦听器吗?

请帮我一些想法,对不起我的学术英语。

【问题讨论】:

  • 使用磁盘持久性和addListenerForSingleValueEvent 不要混用。如果您想使用磁盘持久性,您应该使用addValueListener 来获取缓存值(立即)和可能的更新服务器值(稍后)(无论如何通常推荐)。在这里查看我的详细解释:stackoverflow.com/questions/34486417/…
  • 如果这对您来说是一个真正的问题,请考虑使用Cloud Firestore。那里的get()方法总是会在客户端连接时检查服务器端的值,只有在客户端离线时才返回缓存的值。

标签: java android firebase


【解决方案1】:

如果您启用了离线功能,这意味着即使您的应用暂时失去网络连接,您也可以使用它。所以只要你是offlineValueEventListener 就会一直监听本地存储的数据。如果你想更新结果,那么你需要上网。

如果你只想听一次数据,那么你需要使用:addListenerForSingleValueEvent()。如果您想使用addValueEventListener,请不要忘记根据您的活动的生命周期删除侦听器,因为我已经回答了here

【讨论】:

    【解决方案2】:

    您可以持有对事件侦听器的引用,并在不需要时将其从引用中删除。

    myEventListener = ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            //happy place
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
           //error
        }
    });
    

    其他地方:

    ref.removeEventListener(myEventListener);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 2016-04-01
      相关资源
      最近更新 更多