NullPointerException в неактивном фрагменте - PullRequest
0 голосов
/ 04 июня 2018

У меня есть 2 разных фрагмента: один с EventListener, который проверяет изменения в Firebase, это код:

dbUsers.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);
            favo_team_view = (TextView) myView.findViewById(R.id.favo_team_textview);

            if(!(user.getTeam() == null)) {
                favo_team_view.setText("Your favourite team is: " + user.getTeam());
            } else {
                favo_team_view.setText("Your favourite team is: " );
            }
        }

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

        }
    });

И еще один фрагмент, который удаляет запись в базе данных и запускает намерениезапустить SignInActivity (оба фрагмента являются частью MainActivity);это код

Button deleteUserButton = myView.findViewById(R.id.delete_user);
    deleteUserButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final String uid = auth.getUid();
            final DatabaseReference dbUsers = FirebaseDatabase.getInstance().getReference("users").child(uid);
            auth.getCurrentUser().delete().addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if(task.isSuccessful()){
                        dbUsers.setValue(null);
                        signOut();

                    }else{
                        displayMessage(getString(R.string.user_deletion_error));
                    }
                }
            });
        }
    });

private void signOut(){
    Intent signOutIntent = new Intent(myView.getContext(), SigninActivity.class);
    startActivity(signOutIntent);
    //finish();
}

Код работает в том, что запись в БД удаляется.Но мое приложение вылетает, и трассировка стека сообщает мне:

Java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String com.User.getTeam ()' для ссылки на нулевой объект в com.Выберите команду $ 1.onDataChange

Почему он это делает?Я не понимаю, почему Слушатель все еще проверяет изменения данных (этот фрагмент не активен / открыт, когда я удаляю базу данных)

Спасибо

PS: понял, что я не могу проверитьстрока == ноль, просто подумал, что я бы попробовал.То же самое без оператора if

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Когда вы добавляете слушателя с dbUsers.addValueEventListener, этот слушатель:

  1. Вызывает ваш onDataChanged с самым последним (или кэшированным) значением для узла сразу.
  2. Запускаетсяпрослушивает обновления для этого узла на сервере и снова вызывает ваш onDataChanged при наличии изменений.

Он будет продолжать прослушивание, пока вы не удалите прослушиватель с помощью dbUsers.removeEventListener(...).

Существует два возможных варианта использования, каждый со своим решением.

  1. Данные нужны только один раз.В этом случае просто измените ваш звонок addValueEventListener на addListenerForSingleValueEvent, что автоматически отменит регистрацию слушателя после первого звонка на ваш onDataChange.
  2. Вам нужны данные, чтобы оставаться в курсе, но толькопока ваша активность активна.В этом случае: 2.1.Держите ссылку на слушателя, когда вы регистрируете его.Т.е. ValueEventListener mUsersListener и mUsersListener = new ValueEventListener(....2.2.Удалите прослушиватель в onStop, onPause или другом подходящем методе жизненного цикла с помощью dbUsers.removeEventListener(mUsersListener)
0 голосов
/ 04 июня 2018

Вы должны проверить, существует ли Datasnapshot, например,

 if(datasnapshop.exists(){
    //Your codes here
 }

Вы не можете поставить "==" для сравнения строк в Java, пробовали ли вы

if(user.getTeam().equals(null) //statement ;

И вынезарегистрированный слушатель при приостановке фрагмента (в событии OnPause)?

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