java - 从内部方法返回一个对象

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

我正在尝试为 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/

相关文章:

angularjs - 登录时如何处理状态(Ionic、Firebase、AngularJS)?

java - 谓词检查来自同一类的不同对象的属性是否相等

java - 向 java 格式化程序添加格式化

android listview圆角

带复选框的 Android 可过滤回收 View

firebase - firestore读取可以在客户端无忧无虑地实现吗?

android - 无法让 Android 应用程序连接到 Firebase

java - 如何解决这些与坡度有关的多个问题?

java - 将项目添加到 ArrayList Java Android 时出错

android - 如何为所有分辨率创建 Android 应用程序?