Метод запускается два раза, но вызывается один раз, запрос Firebase - PullRequest
0 голосов
/ 09 марта 2020

Я создаю социальное приложение для своих исследований, и мне нужно использовать Firebase firestore, чтобы хранить некоторую информацию о моем приложении.

Моя проблема проста, но я не понимаю, почему у меня эта проблема. Когда пользователь создает действие, это также создает чат и приветственное сообщение. но мой метод (так мой запрос firebase) вызывается два раза.

private void createAct(SharedActivity SharedAct) {
    ActivityHelper.createActivities(SharedAct.getId(), SharedAct.getTitle(), SharedAct.getDescription(), SharedAct.getAdress(), SharedAct.getDate(), SharedAct.getPicture(), SharedAct.getMaxPartner(), SharedAct.getType(), SharedAct.getUserId()).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            createWelcomeMess(SharedAct);
        }
    });

}

/**
 * To generate a new message in the  new activity
 * To launch the discussion in the activity
 */
private void createWelcomeMess(SharedActivity activityCreated) {
    if (!activityAlreadyCreated){
        MessageHelper.createMessageForChat("Bienvenue dans le chat de discussion", activityCreated.getId(), user).addOnSuccessListener(documentReference -> {
            Toast.makeText(getActivity(), "Votre Activité est bien crée", Toast.LENGTH_SHORT).show();
            Log.i(TAG, "onSuccess: message created");
            activityAlreadyCreated = true;
            new Handler().postDelayed(() -> {
                MainDashBoardFragment fragment = new MainDashBoardFragment();
                Bundle bundle = new Bundle();
                bundle.putString("id", ID);
                fragment.setArguments(bundle);
                getParentFragmentManager().beginTransaction().add(R.id.main_frame_layout, fragment).addToBackStack("frag").commit();
            }, 1000);
        });

    }

Можете ли вы дать мне некоторые объяснения и как решить эту проблему?

Что я уже пробовал:

  1. Инициализируйте этот метод в OnResume LifeCycle.
  2. Измените метод Onclick (с ножом для масла), чтобы слушать onclick с помощью базового c onclickListener.
  3. Поместите немного логического значения помечать, когда сообщение уже создано
    private void createWelcomeMess(SharedActivity activityCreated) {
    if (!activityAlreadyCreated){
        MessageHelper.createMessageForChat("Bienvenue dans le chat de discussion", activityCreated.getId(), user).addOnSuccessListener(documentReference -> {
            Toast.makeText(getActivity(), "Votre Activité est bien crée", Toast.LENGTH_SHORT).show();
            Log.i(TAG, "onSuccess: message created");
            activityAlreadyCreated = true;
            new Handler().postDelayed(() -> {
                MainDashBoardFragment fragment = new MainDashBoardFragment();
                Bundle bundle = new Bundle();
                bundle.putString("id", ID);
                fragment.setArguments(bundle);
                getParentFragmentManager().beginTransaction().add(R.id.main_frame_layout, fragment).addToBackStack("frag").commit();
            }, 1000);
        });

    }

1 Ответ

0 голосов
/ 11 марта 2020

Не могли бы вы попробовать прослушиватель снимков. Как сказано в документации, предполагается, что для запуска только те. В базе данных в реальном времени у меня была та же проблема. И я переключил обычный слушатель на singleEventListener, и он запускает только триггеры. Поэтому предположим, что он эквивалентен singleEventListener, но для Firestore. Я стараюсь избегать использования firestore, так как он взимает большую плату за каждое чтение / запись / обновление, поэтому я сохраняю в firestore только пользовательские данные, которые являются общими, а остальную информацию в реальном времени.

Вот пример кода

query.addSnapshotListener(
    new EventListener<QuerySnapshot>() {
        // ...
    });
...