在Java中创建一个方法返回在内部类中初始化的变量

时间:2017-10-29 12:56:15

标签: java android oop firebase

我有一个方法

public String getUsername(String uid){
       uid= auth.getCurrentUser().getUid();
        DatabaseReference uidRef = mFirebaseuser.child(uid);
        uidRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Log.d("TAG", ""+dataSnapshot);
                String username=dataSnapshot.child("username").getValue(String.class);
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
                System.out.println("what"+databaseError);
            }
        });
        return username;
    }

我希望getUsername返回在内部类中初始化的字符串username,但我无法访问它,我也无法修改onDataChange,因为它已被覆盖。如果我在内部类之前初始化getUsername方法中的用户名,我必须将其设置为最终,然后才能在onDataChange中设置其值,请帮助我解决这个问题。

3 个答案:

答案 0 :(得分:3)

一种方法,在没有测试的情况下,将username声明为您班级中的私有变量,如下所示:

private String username = null;

然后在课堂上使用它另一个地方

if (username != null){
    //TODO what ever with username
}

在你的内部类中删除String并使你的方法为无效

public void onDataChange(DataSnapshot dataSnapshot) {
    Log.d("TAG", ""+dataSnapshot);
    username = dataSnapshot.child("username").getValue(String.class);
}

答案 1 :(得分:0)

使用变量用户名作为全局变量,并在annonymouse类中给出值并将其返回

答案 2 :(得分:0)

一个解决方法是创建一个元素数组并返回它的值。它有点难看,但它有效!

public String getUsername(String uid){
   uid= auth.getCurrentUser().getUid();

   final String[] username = new String[1]; // final makes it accessible inside the inner class

    DatabaseReference uidRef = mFirebaseuser.child(uid);
    uidRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.d("TAG", ""+dataSnapshot);

    username[0]=dataSnapshot.child("username").getValue(String.class);
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            System.out.println("what"+databaseError);
        }
    });
    return username[0]; 
}