从内部方法返回对象 [英] returning an object from an inner method

查看:42
本文介绍了从内部方法返回对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆