Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何归还孩子';从Android中的一个方法得到的Firebase中的s值?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 我如何归还孩子';从Android中的一个方法得到的Firebase中的s值?

Java 我如何归还孩子';从Android中的一个方法得到的Firebase中的s值?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在尝试使用特定用户的UID获取该用户的详细信息。我需要一个方法,可以返回一个字符串类型的用户名,以便我可以存储它,并显示在我的应用程序中 getUserName("UID"); 这就是我的数据库的样子- 这就是我试着做的- private String getUserName(String startedBy) { mProfileRef=database.getReference("Profile").child(startedBy).child("UserDetails")

我正在尝试使用特定用户的UID获取该用户的详细信息。我需要一个方法,可以返回一个字符串类型的用户名,以便我可以存储它,并显示在我的应用程序中

getUserName("UID");
这就是我的数据库的样子-

这就是我试着做的-

 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提供正确的用户名。该方法不返回用户名。它返回null。如何返回用户名?

这是因为
Firebase
操作是异步执行的。这意味着方法
onDataChange
在后台线程上执行,同时UI线程执行原始方法并返回值,而无需等待
Firebase
响应

解决方案可以通过使用接口来完成

1-定义接口

public interface OnDataLoaded {

   onDataLoaded(String username);

}
2-将接口作为方法参数传递

public void getUserName(String startedBy, OnDataLoaded onDataLoaded)
3-使用界面传递用户名。

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) {

    }
});
public class yourActivity implements OnDataLoaded 
4-在活动/片段中使用界面。

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) {

    }
});
public class yourActivity implements OnDataLoaded 
5-您的控制权将转移到您的活动方法onDataLoaded

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

注意:使用任何IDE编写。可能包含一些语法错误。

这是因为
Firebase
操作是异步执行的。这意味着方法
onDataChange
在后台线程上执行,同时UI线程执行原始方法并返回值,而无需等待
Firebase
响应

解决方案可以通过使用接口来完成

1-定义接口

public interface OnDataLoaded {

   onDataLoaded(String username);

}
2-将接口作为方法参数传递

public void getUserName(String startedBy, OnDataLoaded onDataLoaded)
3-使用界面传递用户名。

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) {

    }
});
public class yourActivity implements OnDataLoaded 
4-在活动/片段中使用界面。

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) {

    }
});
public class yourActivity implements OnDataLoaded 
5-您的控制权将转移到您的活动方法onDataLoaded

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

注意:使用任何IDE编写。可能包含一些语法错误。

如果您的firebase代码也在同一类中,您可以直接在firebase数据库读取回调中更新视图

private void getUserName(String startedBy, TextView textView) {
    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);
            textView.setText(userName);
            Log.i(TAG, "onDataChange: "+userName);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

Waqas Pervez的回答也是一个很好的解决方案。

如果您的firebase代码也在同一类中,您可以直接在调用firebase数据库读取中更新视图

private void getUserName(String startedBy, TextView textView) {
    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);
            textView.setText(userName);
            Log.i(TAG, "onDataChange: "+userName);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

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

@Dumbo它是需要用户名的用户的UID可能重复的请检查重复项以查看发生这种情况的确切原因。@Dumbo它是需要用户名的用户的UID可能重复的请检查重复项以查看确切原因为什么会发生这种情况。将所有firebase代码从您的活动中分离出来是一个非常好的解决方案。(Y) MyFragment实现OnDataLoaded。当我调用getUsername()时,我应该传递什么作为我的第二个参数?传递
this
作为第二个参数。非常好的解决方案,可以将所有firebase代码从您的活动中分离出来。(Y) MyFragment实现OnDataLoaded。当我调用getUsername()时,我应该传递什么作为我的第二个参数?传递
this
作为第二个参数。