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()等待对方?
答案 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的迭代而可能会有一些错误。