从内部方法返回一个对象

时间:2018-04-08 17:47:52

标签: java android firebase firebase-realtime-database return-value

我正在尝试为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()方法返回用户用户? 怎么样?

3 个答案:

答案 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