我想從單個事件調用的偵聽器獲取的方法中返回數據。但是,它看起來像我返回的對象正在實際返回語句後填充。我明白,獲取數據快照的調用是異步的,這就是發生這種情況的原因。我怎樣才能避免這種情況?我試過信號量和原子布爾值,但它似乎鎖定了我的應用程序。這是有問題的代碼。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;
}
注:我試過原子布爾設置爲false,則設置爲true,偵聽器內,然後有一段時間(布爾==假)我回來之前,但這會導致我的應用程序的鎖定。
你不能避免這一點。異步性是現代網絡中給出的,你必須接受它。 – 2014-11-21 12:40:47
可能重複[將父範圍中的變量傳遞給回調函數](http://stackoverflow.com/questions/26297654/passing-variable-in-parent-scope-to-callback-function) – 2014-11-21 12:42:17