2017-02-09 4 views
1

Я пытаюсь вернуть логическое значение, но возвращаемое значение всегда false, то есть 0 в этом случае.Возвращаемое значение из valueEventListener java

Контрольная переменная - это переменная экземпляра, и при нажатии кнопки функция вызывается.

private boolean checkAnswerSubmission() { 

    DatabaseReference answerDatabase = FirebaseDatabase.getInstance().getReference().child("userPuzzleHistory").child(uid); 
    answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.hasChild(String.valueOf(imagename))) { 
       check = 1; 
      } else { 
       check = 0; 
      } 
    //here the value check is working fine but the value cannot be returned from here. 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
    //here the value returned is always 0 
    if (check == 1) 
     return true; 
    else 
     return false; 

} 
+0

В Java нет глобальных переменных. – shmosel

+0

мой плохой. внесли изменения .. любая помощь будет отличной @shmosel –

+0

Создайте переменную static. –

ответ

4

Как и во всех асинхронных операциях, я часто делаю это методом обратного вызова.

Ваше решение может работать следующим образом:

  1. Создания простого интерфейса обратного вызова (у меня есть мой в библиотеке, я использую почти каждый приложение)

    public interface SimpleCallback { 
        void callback(Object data); 
    } 
    
    // You could do it as well generic, that's what I do in my lib: 
    public interface SimpleCallback<T> { 
        void callback(T data); 
    } 
    

Тогда перепроектировать подпись вашего метода:

private void checkAnswerSubmission(@NonNull SimpleCallback<boolean> finishedCallback) { 

    DatabaseReference answerDatabase = FirebaseDatabase.getInstance().getReference().child("userPuzzleHistory").child(uid); 
    answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // This will simple call your callback containing a boolean true/false 
      finishedCallback.callback(dataSnapshot.hasChild(String.valueOf(imagename))); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

Вы называете это:

checkAnswerSubmission(new SimpleCallback<boolean>() { 
    @Override 
    void callback(boolean data) { 
     if (data) { 
      // true was returned 
     } else { 
      // false was returned 
     } 
    } 
}); 
+0

Спасибо человеку, что это действительно помогло. @Grisgram –

+0

Спасибо @Grisgram –

2

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

Итак, ваша программа инициализирует слушателя и переходит к следующему утверждению в этой строке.

answerDatabase.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.hasChild(String.valueOf(imagename))) { 
       check = 1; 
      } else { 
       check = 0; 
      } 
    //here the value check is working fine but the value cannot be returned from here. 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

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

if (check == 1) 
     return true; 
    else 
     return false; 

Так что, если ваш чек значение инициализации будет, скорее всего, взять 0 в качестве значения и всегда return false.

Смежные вопросы