【问题标题】:returning an object from an inner method从内部方法返回一个对象
【发布时间】:2018-09-18 03:20:40
【问题描述】:

我正在尝试为 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 用户? 以及如何?

【问题讨论】:

  • 可以使用 RxJava Observable 或者创建接口回调监听器。

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


【解决方案1】:

不,这是不可能的,因为 Firebase 是异步的,您实际上是在尝试通过使调用方法“等待”返回的对象来将此方法转换回阻塞调用。

这里合适的模式是

1) 制作接口。

public interface OnUserResult {
    void onUser(User u);
}

2) 将接口传递给 void 方法
3) 将结果传回回调接口

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 之类的库可以帮助你以其他方式实现这种模式

【讨论】:

  • 它有效!.. 非常感谢。但老实说,我最不明白。你能给我推荐一个教程或其他东西来帮助我理解它吗?
  • 这不是 Android 特有的。这只是事件驱动系统的通用编程模式...stackoverflow.com/q/443708/2308683
【解决方案2】:

用户是否在类的范围内声明?因为否则我不知道getUser() 是如何访问它返回的用户的。尝试在getUser() 中声明用户而不是在onDataChange 中声明用户,因为onDataChange 中的用户仅在该方法的范围内。

另外,如果 onDataChange 从未被调用,则永远不会有声明的用户,它会返回 null

【讨论】:

  • 我也试过这个。在 getUser() 中声明它。但是当我想从 onDataChange() 内部访问它时,它会要求我将其设为最终用户。所以我不能给它分配新的价值!!!
  • 你最好的选择是制作一个界面
【解决方案3】:

不可能从内部类返回任何东西.. 但是可以在内部类中初始化一个实例变量,使该类的所有成员都可以访问它

【讨论】:

    猜你喜欢
    • 2014-04-11
    • 2018-10-01
    • 2016-12-27
    • 2013-02-16
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多