我正在尝试为firebase方法构建一个单独的类, 其中一种方法是返回一个Object User
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()方法返回用户用户? 怎么样?
答案 0 :(得分:3)
不,这是不可能的,因为Firebase是异步的,并且您通过调用方法"等待"有效地尝试将此方法转换回阻塞调用。返回的对象。
这里适当的模式是
1)创建一个界面。
public interface OnUserResult {
void onUser(User u);
}
2)将接口传递给void方法
3)将结果传递回Callback接口
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等库可以帮助您以其他方式实现此模式
答案 1 :(得分:1)
无法从内部类返回任何内容。 但是可以在内部类中初始化一个实例变量,使其可以被类的所有成员访问
答案 2 :(得分:0)
是否在类的范围内声明了用户?因为否则我不知道getUser()
如何访问它正在返回的用户。尝试在getUser()
而非onDataChange
内声明用户,因为onDataChange
中的用户只在该方法的范围内。
此外,如果永远不会调用onDataChange
,则永远不会声明用户,并且它将返回null