Firebase中的同时连接

时间:2018-11-26 20:12:08

标签: android firebase firebase-realtime-database

如果我设置scoresRef.keepSynced(false)并使用磁盘持久性FirebaseDatabase.getInstance().setPersistenceEnabled(true);在本地存储数据,由于没有活动的侦听器,它会降低与Firebase DB的“同时连接”的数量(或不是吗?)?可能会有什么后果?

代码:

我有一个带有getter / setter方法的自定义适配器“ firebaseadapter”和一个“ firebasestore”类。由于“必须在对Firebase数据库实例进行任何其他使用之前进行对setPersistenceEnabled的调用,所以我制作了一个扩展Application 或在static {}的主活动类中使用它的不同类。更好? )。

Utility.calculateNoOfColumns正在根据屏幕尺寸计算要显示的网格数。

此外,如果在集合scoresRef.keepSynced(false)中对firebase DB进行了任何更改,数据是否会在客户端实时更新?

public class ThreeFragment extends Fragment {
View viewThree;
ArrayList<firebasestore> list;
DatabaseReference mdatabase;
GridLayoutManager gridLayoutManager;
private  firebaseAdapter firebaseAdapter1;
FirebaseDatabase database;

public ThreeFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    FirebaseApp.initializeApp(getContext());
    database= FirebaseDatabase.getInstance();
    mdatabase=database.getReference().child("DBName");
    mdatabase.keepSynced(false);

    list = new ArrayList<>();
    loadStoreDetails();
}

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    viewThree = inflater.inflate(R.layout.fragment_three, container, false);
    int mNoOfColumns = Utility.calculateNoOfColumns(getContext());

    RecyclerView firebaseRecyclerView = (RecyclerView) 
    viewThree.findViewById(R.id.recyclerview_threeFragment1);
    firebaseRecyclerView.setHasFixedSize(true);
    firebaseAdapter1 = new firebaseAdapter(getContext(), list);
    firebaseRecyclerView.setLayoutManager(gridLayoutManager);
    firebaseRecyclerView.setAdapter(firebaseAdapter1);

    return viewThree;
}

// get data from firebase DB
private void loadStoreDetails() {
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            list.clear();  // CLAER DATA BEFORE CHANGING. IF NOT DONE, IT WILL SHOW DUPLICATE DATA
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                list.add(ds.getValue(firebasestore.class));
            }
            firebaseAdapter1.notifyDataSetChanged();    // NOTIFY ADAPTER TO SHOW DATA IN VIEW WITHOUT RELOAD
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w("LogFragment", "loadLog:onCancelled", databaseError.toException());
        }
    };
    mdatabase.limitToLast(20).addValueEventListener(valueEventListener);

}

}

1 个答案:

答案 0 :(得分:2)

如果一分钟内没有活动的侦听器,则Firebase客户端确实将关闭其与服务器的连接。

在您的代码中,调用loadStoreDetails会为addValueEventListener中的onCreate附加一个侦听器。由于您从不会删除该侦听器,因此从创建ThreeFragment到程序退出,它将永久保持活动状态。

为防止这种情况,并确保仅在用户打开片段(片段的onDestroyViewonDestroy中的detach the listener时才同步数据(连接保持打开状态)。

为此,在片段中添加一个成员字段:

ValueEventListener mFragmentListener;

然后在附加侦听器时保留对其的引用:

mFragmentListener = mdatabase.limitToLast(20).addValueEventListener(valueEventListener);

最后在片段被破坏时删除侦听器:

@Override
public void onDestroyView() {
    mdatabase.limitToLast(20).removeEventListener(mFragmentListener);
}

另外,请注意:代码中不需要调用mdatabase.keepSynced(false);,因为这已经是默认行为。