如果我设置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);
}
}
答案 0 :(得分:2)
如果一分钟内没有活动的侦听器,则Firebase客户端确实将关闭其与服务器的连接。
在您的代码中,调用loadStoreDetails
会为addValueEventListener
中的onCreate
附加一个侦听器。由于您从不会删除该侦听器,因此从创建ThreeFragment
到程序退出,它将永久保持活动状态。
为防止这种情况,并确保仅在用户打开片段(片段的onDestroyView
或onDestroy
中的detach the listener时才同步数据(连接保持打开状态)。
为此,在片段中添加一个成员字段:
ValueEventListener mFragmentListener;
然后在附加侦听器时保留对其的引用:
mFragmentListener = mdatabase.limitToLast(20).addValueEventListener(valueEventListener);
最后在片段被破坏时删除侦听器:
@Override
public void onDestroyView() {
mdatabase.limitToLast(20).removeEventListener(mFragmentListener);
}
另外,请注意:代码中不需要调用mdatabase.keepSynced(false);
,因为这已经是默认行为。