Android Firebase会更新addListenerForSingleValueEvent

时间:2018-03-03 13:37:33

标签: java android firebase

我尝试使用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一直在监听本地存储的数据,而我需要保持它始终更新...它是一个搜索查询。< / p>

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

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

请帮助我一些想法并抱歉我的学术英语。

2 个答案:

答案 0 :(得分:1)

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

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

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

其他地方:

ref.removeEventListener(myEventListener);

答案 1 :(得分:1)

如果您启用了离线功能,则表示即使暂时失去网络连接,您也可以使用自己的应用。因此ValueEventListener只要您offline,就会继续监听本地存储的数据。如果您希望更新结果,则需要上线。

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