Я пытаюсь вернуть данные в методе, который я получаю от слушателя для вызова одного события. Однако, похоже, что объект, который я возвращаю, заполняется после фактического оператора return. Я понимаю, что вызов для получения моментального снимка данных является асинхронным, и именно поэтому это происходит. Как я могу избежать этого? Я пробовал Семафоры и Atomic Booleans, но, похоже, я заблокировал свое приложение. Вот этот код.Firebase: Как захватить данные в реальном времени
static User getUser(String uid){
/**** created final object here for returning ****/
final User returnUser = new User();
Firebase userRef = new Firebase("<firebase-url>/users/"+uid+"/");
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d("MT", "attempting to instantiate user");
User tempUser = dataSnapshot.getValue(User.class);
/**** preparing object for return ****/
returnUser.setNickname(tempUser.getNickname());
returnUser.setAge(tempUser.getAge());
returnUser.setEmail(tempUser.getEmail());
returnUser.setHeight(tempUser.getHeight());
returnUser.setSex(tempUser.getSex());
returnUser.setWeight(tempUser.getWeight());
//This logs actual information
Log.d("MT", returnUser.getNickname() + " =======INSTANTIATED=======.");
Log.d("MT", returnUser.getEmail());
Log.d("MT", new Double(returnUser.getAge()).toString());
Log.d("MT", new Double(returnUser.getHeight()).toString());
Log.d("MT", returnUser.getSex());
Log.d("MT", new Double(returnUser.getWeight()).toString());
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.d("MT", "Something went wrong.");
}
});
Log.d("MT", returnUser.getNickname()); //This logs an empty string.
return returnUser;
}
Примечание: Я пытался Atomic логическое значение ЛОЖЬ, то значение ИСТИНА в слушателя, а затем иметь какое-то время (булево == ложь), прежде чем я вернусь, но это приводит к блокировки моего приложения.
Вы не можете избежать этого. Асинхронность - это данность в современной сети, и вы должны ее принять. –
Возможный дубликат [Передача переменной в родительской области для функции обратного вызова] (http://stackoverflow.com/questions/26297654/passing-variable-in-parent-scope-to-callback-function) –