Выборка данных из базы данных Firebase по какой-то причине прекращается - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть класс, который выбирает данные из базы данных и создает новую таблицу из выбранной таблицы.

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

вот (часть) мои методы извлечения -


private void sortUsersByMostParticipation(Map<String, RetentionFeedUser> retentionFeedUserHashMap) {
    mRetentionUserList = new ArrayList<>(retentionFeedUserHashMap.entrySet());
    Collections.sort(mRetentionUserList, (entry, t1) -> entry.getValue().compareTo(t1.getValue()));
    Collections.reverse(mRetentionUserList);
    //Timber.tag("sorted retentionList").d(String.valueOf(mRetentionUserList));

    List<Map.Entry<String, RetentionFeedUser>> topUsersList = new ArrayList<>();

    //checking the list size - mainly for dev branch where we do not have that much profiles to fetch though and we may have less than 100.
    int sizeOfList;
    if (mRetentionUserList.size() < 100 + numberOfNoneExistingProfiles) {
      sizeOfList = mRetentionUserList.size();
    } else {
      sizeOfList = 100 + numberOfNoneExistingProfiles;
    }
    for (int i = 0; i < sizeOfList; i++) {
      topUsersList.add(mRetentionUserList.get(i));
    }
    createFullUserProfileList(topUsersList, (numberOfNoneExistingProfiles > 0));
  }

  private void createFullUserProfileList(List<Map.Entry<String, RetentionFeedUser>> userList, boolean alreadyFetchedNoneExisting) {
    finalSortedArraySize = userList.size();

    RFModel rfModel = new RFModel(new ArrayList<>());

    for (int i = 0; i < userList.size(); i++) {
      Map.Entry<String, RetentionFeedUser> user = userList.get(i);
      Timber.tag(TAG).d("number of videos uploaded - %s profile UID - %s", user.getValue().getVideoCounter(), user.getKey());
      String userUID = user.getKey();
      Query query = mDatabaseReference.child(FBDatabaseUtils.FIREBASE_CHILD_PROFILES).child(userUID);
      query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
          currentIndexOfFinalSortedArray++;

          if (!dataSnapshot.exists()) {
            if (!alreadyFetchedNoneExisting) {
              numberOfNoneExistingProfiles++;
            }
            Timber.tag(TAG).d("profile does not exist");

            return;
          }

          Profile value = dataSnapshot.getValue(Profile.class);

          String name = value.getName();
          String photoUrl = value.getPhotoUrl();
          String email = value.getEmail();
          int videoCounter = user.getValue().getVideoCounter();
          int winningCounter = user.getValue().getWinningCounter();


          RFUser rfUser = new RFUser(name, photoUrl, email, videoCounter, winningCounter, userUID);
          rfModel.addUser(rfUser);

          if (currentIndexOfFinalSortedArray + numberOfNoneExistingProfiles >= finalSortedArraySize + numberOfNoneExistingProfiles) { 
            // this point is never being reached, leaving the proggres bar to spin forever 
            if (numberOfNoneExistingProfiles > 0 && !alreadyFetchedNoneExisting) {
              currentIndexOfFinalSortedArray = 0;
              sortUsersByMostParticipation(mRetentionFeedUserHashMap);
            }

            Timber.tag("finished").d("array index %s", currentIndexOfFinalSortedArray);
            Timber.tag("finished").d("array size %s", finalSortedArraySize);

            mDatabaseReference.child(FBDatabaseUtils.FIREBASE_TABLE_RETENTION).setValue(rfModel);
            hideRetentionProgressBar();
            fetchDataTimestamp();
            Toast.makeText(getContext(), "data refreshed successfully", Toast.LENGTH_SHORT).show();
          }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

          currentIndexOfFinalSortedArray++;

          Timber.tag("on cancelled reached").d("inside onCancelled +%s", currentIndexOfFinalSortedArray);

        }
      });

    }

  }


Этот код завершается ошибкой, когда внутри метода 'createFullUserProfileList' переменная i достигает 17 (размер списка равен 18) и при нажатии на следующую кнопкуотладчик не достигает 18. А также, 2 проверяемых переменных - значение «currentIndexOfFinalSortedArray» равно 15, а другое значение «currentIndexOfFinalSortedArray» равно 3.

Кажется, я не понимаю, чтозаставляет функцию зависать и не продолжать работу внутри оператора if функции createFullUserProfileList.

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