【发布时间】:2014-11-21 01:49:26
【问题描述】:
我正在尝试以从单个事件调用的侦听器获取的方法返回数据。但是,看起来我要返回的对象是在实际的 return 语句之后填充的。我知道获取数据快照的调用是异步的,这就是发生这种情况的原因。我怎样才能避免这种情况?我试过信号量和原子布尔值,但它似乎锁定了我的应用程序。这是有问题的代码。
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 boolean 设置为 false,然后在侦听器中设置为 true,然后在返回之前有一段时间(boolean == false),但这会导致我的应用程序锁定。
【问题讨论】:
-
你无法避免这一点。异步性在现代网络中是既定的,你必须接受它。