我正在尝试为 firebase 方法构建一个单独的类, 这些方法之一是返回对象用户
public User getUser(){
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.child("users").child(mUserID).child("user_info").getValue(User.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "onCancelled: Error: " + databaseError.getMessage());
}
});
return user;
}
返回用户给我一个错误。 是否可以从内部 onDataChange() 方法返回 User 用户? 以及如何?
最佳答案
不,这是不可能的,因为 Firebase 是异步的,并且您实际上是在尝试通过使调用方法“等待”返回的对象来将此方法转换回阻塞调用。
这里合适的模式是
1) 制作界面。
public interface OnUserResult {
void onUser(User u);
}
2) 将接口(interface)传递给 void 方法
3) 将结果传回回调接口(interface)
public void getUser(final OnUserResult callback) {
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.child("users").child(mUserID).child("user_info").getValue(User.class);
if (null!=callback) callback.onUser(user);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "onCancelled: Error: " + databaseError.getMessage());
}
});
}
4) 重写调用方法以不期望返回对象
// Bad: User user = api.getUser();
// Good
api.getUser(new OnUserResult() {
@Override public void onUser(User u) {
// Update the UI, or whatever
// Do not assign a global user variable here either
}
});
// any external user variable will (usually) still be null here
RxJava 等库可以帮助您以其他方式实现此模式
关于java - 从内部方法返回一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49720869/