firebase android多事件监听器对静态变量的callBacks

时间:2017-07-22 05:24:27

标签: android firebase firebase-realtime-database

discussionReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Discussion discussion = dataSnapshot.getValue(Discussion.class);
            discussionAdapter.add(discussion);
            //cancel spinner
            t[0]++;
            if(t[0]>=2)setNormalScreen();
            ObjectsKeysManager.discussionIds.add(dataSnapshot.getKey());/*this is my static variable*/
            discussionAdapter.notifyItemInserted(ObjectsKeysManager.discussionIds.size()-1);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            Discussion newDiscussion = dataSnapshot.getValue(Discussion.class);
            String discussionKey = dataSnapshot.getKey();

            int discussionIndex = ObjectsKeysManager.discussionIds.indexOf(discussionKey);
            if(discussionIndex>-1)
            {
                discussionAdapter.update(newDiscussion, discussionIndex);
                discussionAdapter.notifyItemChanged(discussionIndex);
            }
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot)
        {
            Discussion removedDiscussion = dataSnapshot.getValue(Discussion.class);
            int index = ObjectsKeysManager.discussionIds.indexOf(dataSnapshot.getKey());
            ObjectsKeysManager.discussionIds.remove(index);/*here its changed*/
            discussionAdapter.removeElement(removedDiscussion);
            discussionAdapter.notifyDataSetChanged();
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

如果user1添加了child,user2删除了child,user3会在同一时间更新另一个子。显然 ObjectsKeysManager.discussionIds 就是全部。如何锁定变量 ObjectsKeysManager.discussionIds ?或者如何专业地实施这个? 另外 做 onChildAdded(),onChildChanged(),onChildRemoved()等待对方?

2 个答案:

答案 0 :(得分:0)

为了解决这个问题,我使用transaction operation重新命令你。当我们谈论并发修改时,这是实现这一目标的最佳方式。

我还使用只有一个名为onDataChange()的方法的var m2t = require('./leaflet-m2t.js'); 重新命令,该方法读取并侦听特定路径的整个内容的更改。

希望它有所帮助。

答案 1 :(得分:0)

正如@Alex Mamo建议我一直在研究Transaction类和事务只对单个节点有帮助,但在我的情况下,最大的问题是使onChildEventListener()线程安全(我不知道它是否默认但是没有&# 39; t冒风险),我提出的解决方案是制作方法公共同步void onChildModified(DataSnaphot dataSnaphot,String type)并重定向 onChildChanged() onChildRemoved()通过将快照作为参数传递给它,这使得发生的任何事件直接转到synchronized方法并保存了一天,关于 onChildAdded()它没有必要make是线程安全的原因,为了更改删除必须添加的孩子,所以不需要把它放在 onChildModified()(即使你因为snapShot的迭代而可能会有一些错误。