从内部方法返回对象 [英] returning an object from an inner method
问题描述
我正在尝试为Firebase方法构建一个单独的类, 这些方法之一是返回对象用户
I am trying to build a separate class for firebase methods, one of these methods is to return an 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()方法返回User用户? 以及如何?
returning the user gives me an error. is it possible to return the User user from the inner onDataChange() method? and how?
推荐答案
否,这不可能,因为Firebase是异步的,并且您正在有效地尝试通过使调用方法等待……"将该方法转换回阻塞调用返回的对象.
No, it's not possible because Firebase is asynchronous, and you're effectively trying to convert this method back into a blocking call by making the calling method "wait for" a returned object.
这里合适的模式是
1)建立一个界面.
1) make an interface.
public interface OnUserResult {
void onUser(User u);
}
2)将接口传递给void方法
3)将结果传递回回调接口
2) pass interface into void method
3) pass result back to Callback 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)重写调用方法以不希望返回对象
4) Rewrite the calling method to not expect a returned object
// 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之类的库可帮助您以其他方式实现此模式
Libraries such as RxJava help you to implement this pattern in other ways
这篇关于从内部方法返回对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!