LiveData и ViewModel вызываются из базы данных Firebase Realtime только один раз, а не постоянно.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 LiveData и ViewModel вызываются из базы данных Firebase Realtime только один раз, а не постоянно.

Сообщение Anonymous »


У меня есть следующий DialogFrament с базой данных Firebase Realtime вместе с ViewModel и LiveData для постоянного прослушивания изменений в базе данных:

публичный класс DialogFR_LevelEnd расширяет DialogFragment и реализует View.OnClickListener { общедоступная привязка DialoagFragmentLevelEndingBinding; частный двойной co2SavingsScore; частный RecyclerView recyclerView_HighScore; частный RV_Adapter_Highscore адаптер_HighScore; частный RecyclerView.LayoutManager layoutManager_HighScore; частный ArrayList arrayList_HighScore; частный int PastDaysForDisplayingScores = 0; частный int currentLevel; //Компоненты Firebase частная ViewModel_DialogFR_LevelEnd viewModel; LiveData liveData; DataSnapshot currentDataSnapShotFromFirebase; Ссылка на базу данных rootRef_Firebase; Строка FIREBASE_CO_2_SCORE = "co2_score"; Строка FIREBASE_DATE = «дата»; Строка FIREBASE_DATE_IN_MILLISCONDS = "date_in_millisecons"; Строка FIREBASE_LEVEL = «уровень»; Строка FIREBASE_NAME = «имя»; public static DialogFR_LevelEnd newInstance(double co2SavingsScore, double NeedCO2SavingScore, int currentLevel) { Фрагмент DialogFR_LevelEnd = новый DialogFR_LevelEnd(); Bundle args = новый Bundle(); args.putDouble("co2SavingsScore", co2SavingsScore); args.putDouble("neededCO2SavingScore", NeedCO2SavingScore); args.putInt("currentLevel", currentLevel); фрагмент.setArguments(args); вернуть фрагмент; } public View onCreateView (инфлятор LayoutInflater, контейнер ViewGroup, Пакет saveInstanceState) { привязка = DialoagFragmentLevelEndingBinding.inflate(инфлятор, контейнер, ложь); double co2SavingsScore = getArguments().getDouble("co2SavingsScore", 0.0); double NeededCO2SavingsScore = getArguments().getDouble("neededCO2SavingScore", 0.0); this.currentLevel = getArguments().getInt("currentLevel", 0); привязка.textViewLevelFinishedMessageCO2.setText("Вам нужно было сэкономить " + NeedCO2SavingsScore+ "г CO2, и вы получили " + co2SavingsScore + «g»); //Проверяем, прошел ли уровень успешно if (co2SavingsScore>= необходимостиCO2SavingsScore) { //Уровень пройден привязка.imageViewCloseSymbol.setVisibility(View.INVISIBLE); } еще { //Уровень не пройден привязка.imageViewCheckmark.setVisibility(View.INVISIBLE); привязка.imageViewRepeatSymbol.setClickable(false); привязка.imageViewRepeatSymbol.setAlpha(0.5f); привязка.textViewNextLevel.setAlpha(0.5f); } //Инициализируем список массивов highScore и адаптер RV arrayList_HighScore = новый ArrayList(); адаптер_HighScore = новый RV_Adapter_Highscore (arrayList_HighScore); //Компоненты Firebase String FIREBASE_URL = "https://heatinggamehighscores-default-r ... abase.app/"; if (FirebaseApp.getApps(getContext()).isEmpty()) { Опции FirebaseOptions = новый FirebaseOptions.Builder() .setApplicationId("1:248974012708:android:3f93234ba2066ed41643b1") .setDatabaseUrl(FIREBASE_URL) .строить(); FirebaseApp.initializeApp(getContext(), options); } rootRef_Firebase = FirebaseDatabase.getInstance(FIREBASE_URL).getReference(); rootRef_Firebase.keepSynced (истина); // Инициализируем ViewModel viewModel = новый ViewModelProvider(this).get(ViewModel_DialogFR_LevelEnd.class); viewModel.setFirebaseNodeLevel(currentLevel); viewModel.setPastTimeMillis(pastDaysForDisplayingScores); liveData = viewModel.getData(); Log.e("Tag_Dialog", "DialogFragment: ViewModel вызывает вызов данных"); liveData.observe(this, new Observer() { @Override public void onChanged(@Nullable DataSnapshot dataSnapshot) { Log.e("Tag_Dialog", "DialogFragment: onChanged Called"); если (dataSnapshot!= ноль) { Log.e("Tag_Dialog", "DialogFragment: DataSnapshot!=null"); arrayList_HighScore.clear(); for(DataSnapshot ds: dataSnapshot.getChildren()) { Log.e("Tag_Dialog", "DialogFragment: итерация DataSnapshot"); если (дс != ноль) { Имя строки = ""; int co2Score = 0; Строка даты = ""; внутренний уровень = 0; int позиция = 0; // обновляем здесь пользовательский интерфейс значениями из снимка if(ds.child(FIREBASE_NAME).getValue(String.class)!=null) { name = ds.child(FIREBASE_NAME).getValue(String.class); } if(ds.child(FIREBASE_CO_2_SCORE).getValue(Integer.class)!=null) { co2Score = ds.child(FIREBASE_CO_2_SCORE).getValue(Integer.class); } if(ds.child(FIREBASE_LEVEL).getValue(Integer.class)!=null) { уровень = ds.child(FIREBASE_LEVEL).getValue(Integer.class); } if(ds.child(FIREBASE_DATE).getValue(String.class)!=null) { date = ds.child(FIREBASE_DATE).getValue(String.class); } arrayList_HighScore.add(new RV_Item_Highscore(имя, co2Score, дата, уровень, позиция)); } } } }// заканчиваем при изменении }); //заканчиваем наблюдение buildRecyclerView(); вернуть привязку.getRoot(); } общественный недействительный buildRecyclerView () { recyclerView_HighScore = привязка.rvHighScoreStatisticsToBeDisplayed; recyclerView_HighScore.setHasFixedSize (истина); LayoutManager_HighScore = новый LinearLayoutManager(this.getContext()); recyclerView_HighScore.setLayoutManager(layoutManager_HighScore); recyclerView_HighScore.setAdapter(adapter_HighScore); } public void onViewCreated(@NonNull View view, @Nullable Bundle saveInstanceState) { super.onViewCreated(просмотр, saveInstanceState); } @Override public void onClick (Просмотр) { if (просмотреть экземпляр ToggleButton) { if (binding.tbuttonHighScoreLastWeek.isChecked()) { this.pastDaysForDisplayingScores = 7; } if (binding.tbuttonHighScoreLastMonth.isChecked()) { this.pastDaysForDisplayingScores = 30; } если (binding.tbuttonHighScoreOverall.isChecked()) { this.pastDaysForDisplayingScores = 10000; } viewModel.setPastTimeMillis(pastDaysForDisplayingScores); } } } и соответствующий класс ViewModel и LiveData:

публичный класс ViewModel_DialogFR_LevelEnd расширяет ViewModel { общедоступная статическая окончательная строка FIREBASE_URL = "https://heatinggamehighscores-default-r ... abase.app/"; общедоступная статическая строка FIREBASE_NODE_LEVEL = ""; общедоступная статическая окончательная строка FIREBASE_DATE_IN_MILLISCONDS = "date_in_millisecons"; частные данные MutableLiveData = новые MutableLiveData(); частный статический длинный PastTimeMillis; public void setFirebaseNodeLevel (int levelNumber) { FIREBASE_NODE_LEVEL = "level_" + levelNumber; } public void setPastTimeMillis (int PastDaysForDisplayingScores) { PastTimeMillis = System.currentTimeMillis() - (длинный) (pastDaysForDisplayingScores * 24L * 60 * 60 * 1000); data.postValue(ноль); } public LiveData getData() { Log.e("Tag_Dialog", "ViewModel: вызов getData"); Запрос QUERY_DATE = FirebaseDatabase.getInstance(FIREBASE_URL).getReference().child(FIREBASE_NODE_LEVEL).orderByChild(FIREBASE_DATE_IN_MILLISECONDS).startAt(pastTimeMillis); Log.e("Tag_Dialog", "ViewModel: Query = = + QUERY_DATE); возврат данных; } } База данных Firebase Realtime выглядит следующим образом:
Изображение


На самом деле я не понимаю, почему метод onChanged вызывается только один раз? Даже когда я меняю значения базы данных, метод onChanged не вызывается повторно, хотя я думал, что с liveData метод следует вызывать каждый раз при изменении базы данных. Кроме того, я не понимаю, почему dataSnapshot всегда имеет значение null, хотя запрос в ViewModel Query QUERY_DATE = FirebaseDatabase.getInstance(FIREBASE_URL).getReference().child (FIREBASE_NODE_LEVEL).orderByChild(FIREBASE_DATE_IN_MILLISECONDS).startAt(pastTimeMillis); должен что-то возвращать?

Напоминание: никто не имеет ни малейшего понятия? Или, возможно, невозможно использовать Firebase RealtimeDatabase для обновления данных в реальном времени?
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»