Firebase setPersistenceEnabled(true)和keepSynced(true)会产生一些问题

时间:2017-03-16 07:33:49

标签: android firebase firebase-realtime-database

我想保持数据离线并使用它,当网络可用时,数据应该同步到所有实例,我已经

public class MyApp extends Application {      

    @Override
    public void onCreate() {
        super.onCreate();
        FirebaseDatabase.getInstance().setPersistenceEnabled(true);
    }
}
在MainActivity I' ve

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mDatabaseReference = FirebaseUtils.getAllPostsDatabaseReference();
        mDatabaseReference.keepSynced(true);
    }

出现了一个问题,即在添加新孩子时会多次显示相同的数据,以避免我在儿童监听器中添加了一个技巧

@Override
public void onResume() {
    super.onResume();

    cleanUp();

    mChildEventListener = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            try{
                if (dataSnapshot.exists() && dataSnapshot.hasChildren() && !dataSnapshot.equals(null)){
                    MyObject mo =  dataSnapshot.getValue(MyObject.class);
                    mList.add(mo);
                    mAdapter.notifyDataSetChanged();

                } else {
                    ///
                }
            } catch (Exception e){
                e.printStackTrace();
            }
        }

        // omitting @Override methods 

    };

    mQuery = getQuery();
    mQuery.addChildEventListener(mChildEventListener);

    mAdapter = new MyAdapter((AppCompatActivity)getContext(), mList);
    mRecyclerView.setAdapter(mAdapter);
} 

当活动恢复时,我调用

的cleanUp()
private void cleanUp(){
    try {
        if (mAdapter != null && mList.size() > 0){
            mAdapter.clear();
            mList.clear();
            Log.e("ADAPTER", "Cleared");
        }
    } catch (Exception e){
        e.printStackTrace();
    }
}

这一点App已恢复它工作正常并且没有任何数据重复,但是当应用程序在设备上运行并且数据被添加到子设备时,它会复制新添加数据的实例,因为可能存在设备使用应用程序(即如果当前有10个活动设备正在使用该应用程序,那么新添加的每个设备分别显示重复的1,2,3,4,5,6,7,8,9次,并不是这种奇怪的行为?)

好的我尝试做这样的改变add cleanUp();在onChildAdded()

mChildEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                cleanUp();// Added here to avoid data duplication
                try{
                    if (dataSnapshot.exists() && dataSnapshot.hasChildren() && !dataSnapshot.equals(null)){
                        MyObject mo =  dataSnapshot.getValue(MyObject.class);
                        mList.add(mo);
                        mAdapter.notifyDataSetChanged();

                    } else {
                        ///
                    }
                } catch (Exception e){
                    e.printStackTrace();
                }
            }

            // omitting @Override methods 

        };

此时没有发生重复,只显示新添加的数据,并清除所有其他子项。

0 个答案:

没有答案