У меня есть класс, который выбирает данные из базы данных и создает новую таблицу из выбранной таблицы.
Моя логика, казалось, работала в течение пары раз, но теперь при попытке повторного извлечения данных, когда происходят определенные ситуации, он просто загружается навсегда и не отображает никакой новой информации.
вот (часть) мои методы извлечения -
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.