Одновременные соединения в firebase - PullRequest
0 голосов
/ 26 ноября 2018

Если я установлю scoresRef.keepSynced(false) и использую постоянство диска, FirebaseDatabase.getInstance().setPersistenceEnabled(true); для локального хранения данных, уменьшится ли количество «одновременных подключений» к базе данных Firebase, так как активных слушателей не будет (или нет?)какие могут быть последствия?

Коды:

У меня есть специальный адаптер "firebaseadapter" и класс "firebasestore" с методами получения / установки.Поскольку «вызовы setPersistenceEnabled должны выполняться перед любым другим использованием экземпляра базы данных firebase», я создал другой класс, расширяющий Application ( или лучше использовать его в основном классе активности с static {}? ).

Utility.calculateNoOfColumns рассчитывает количество отображаемых сеток на основе размера экрана.

Кроме того, будут ли данные обновляться в клиентесторона в режиме реального времени, если я сделаю какие-либо изменения в базе данных Firebase, если набор scoresRef.keepSynced(false)?

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 голосов
/ 26 ноября 2018

Если в течение минуты нет активных прослушивателей, клиент Firebase действительно закроет свое соединение с сервером.

В вашем коде, который вы вызываете loadStoreDetails, присоединяется слушатель с addValueEventListener из onCreate,Поскольку вы никогда не удаляете этот прослушиватель, он будет оставаться активным постоянно с момента создания ThreeFragment до момента выхода из программы.

Чтобы предотвратить это, и обеспечить синхронизацию данных (и соединение остается открытым), покау пользователя есть открытый фрагмент, отсоединяет слушателя в onDestroyView или onDestroy фрагмента.

Для этого добавьте поле члена к фрагменту:

ValueEventListener mFragmentListener;

Затем сохраните ссылку на слушателя, когда прикрепите его:

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

И, наконец, удалитеслушатель, когда фрагмент уничтожен:

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

Отдельное примечание: вызов кода mdatabase.keepSynced(false); не требуется в вашем коде, так как это уже поведение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...