如何从Android中的方法返回Firebase中儿童的值?

时间:2018-03-29 06:45:48

标签: java android firebase firebase-realtime-database

我正在尝试使用他的UID获取特定用户的用户详细信息。我需要一个方法,可以将userName作为String类型返回,以便我可以存储它并在我的应用程序中显示它。

getUserName("UID");

这就是我的数据库的样子 - enter image description here

这是我试过的 -

 private String getUserName(String startedBy) {
    mProfileRef=database.getReference("Profile").child(startedBy).child("UserDetails").child("userName");
    mProfileRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            userName = dataSnapshot.getValue(String.class);
            Log.i(TAG, "onDataChange: "+userName);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return userName;
}

Log语句完美执行,并根据UID提供正确的userName。该方法不返回userName。它返回null。如何返回userName?

2 个答案:

答案 0 :(得分:3)

这是因为onDataChange操作是异步执行的。这意味着方法Firebase在后​​台线程上执行,同时您的UI线程执行原始方法并返回值而不等待public interface OnDataLoaded { onDataLoaded(String username); } 响应。

可以使用界面完成解决方案。

1 - 定义界面

public void getUserName(String startedBy, OnDataLoaded onDataLoaded)

2 - 将界面作为方法参数

传递
mProfileRef = database.getReference("Profile").child(startedBy).child("UserDetails").child("userName");
mProfileRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        userName = dataSnapshot.getValue(String.class);
        onDataLoaded.onDataLoaded(username);
        Log.i(TAG, "onDataChange: "+userName);

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

3 - 使用界面传递用户名。

public class yourActivity implements OnDataLoaded 

4 - 使用您的活动/片段中的界面。

@Override
public void onDataLoaded(String userName) {
    // your userName will be available here.
    // you can use your bindings here.
}

5 - 您的控件将转移到您的活动方法onDataLoaded

results = []
mylist = ['jellyfish','jellyish','jellyish','smellyfish']

#convert to unicode
mylist = [unicode(i) for i in mylist]

for i, j in enumerate(mylist):
    current = mylist[i] 
    previous = mylist[i-1]
    current_score = jf.jaro_winkler(current, previous)
    if(current_score > 0.96):
        current=previous
    print current, current_score

注意:在没有任何IDE的情况下编写。可能包含一些语法错误。

答案 1 :(得分:0)

您可以直接更新回调内的视图,以获取firebase数据库读取,因为您的firebase代码也在同一个类中。

n*(2^d)

Waqas Pervez的答案也是一个非常好的解决方案。