【问题标题】:How to change instance variables inside anonymous class [duplicate]如何更改匿名类中的实例变量[重复]
【发布时间】:2020-04-02 17:11:36
【问题描述】:

我有一个类UserName,它是为了在提供用户ID 时返回用户名而创建的。问题是我无法更改匿名类ValueEventListener 中的实例变量userName。匿名类中的Log.i() 函数成功打印了正确的用户名,但在通过getUserName() 函数返回变量时,它返回空字符串变量。如何在任何匿名类中更改此类实例变量

public class UserName {
    String userName;
    public UserName(String userID){
        DatabaseReference dbRefUsers = FirebaseDatabase.getInstance().getReference("Users");
        Query queryGetUserName = dbRefUsers.orderByChild("userID").equalTo(userID);
        queryGetUserName.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()){
                    for(DataSnapshot dataSnapshotCurrent: dataSnapshot.getChildren()){
                        User userCurrent = dataSnapshotCurrent.getValue(User.class);
                        userName = userCurrent.getName();
                        Log.i("userName",userName);
                    }
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
    public String getUserName() {
        return userName;
    }
}

【问题讨论】:

  • 这似乎是一个可能的XY Problem 类型问题,因为我认为问题不在于您无法更改用户名,因为实例变量 可以 被更改在内部类中,匿名或其他,并且您的代码看起来正在这样做,但也许这里的问题是您调用getUserName() 之前它已更改,因为它在回调方法中更改.请发布有关您如何使用此代码以及何时致电getUserName() 的更多信息
  • @HovercraftFullOfEels 我在我的活动中使用此代码userName = new UserName(userID).getUserName();
  • 正如我所解释的,这就是您的代码无法正常工作的原因。用户名在 call-back 方法中更改,这意味着它不会立即发生,也可能根本不会发生,只有当触发回调的事件发生时.您最好阅读回调方法,因为您似乎不了解它们如何工作以及这对您的代码有何影响。
  • 阅读触发 FireBase 数据库调用 onDataChange(...) 方法的原因。 是你的回调方法被触发的时候。
  • 那么我如何创建一个类,如果我在我的活动中调用它会在提供适当的用户 ID 时返回正确的用户名?

标签: java android firebase-realtime-database instance-variables anonymous-class


【解决方案1】:

代码应该可以工作,如果你调用getUserName之后你调用你的onDataChange方法。

这是一个示例,说明它使用 JButtonActionListener 工作

public class UserName {
    private String userName;
    private JButton button = new JButton();

    public UserName() {
        button.addActionListener(e -> userName = "bob");
    }

    public String getUserName() {
        return userName;
    }
}

如果我这样做了

UserName userName = new UserName();
System.out.println(userName.getUserName());

它打印 null。

但如果我这样做了

UserName userName = new UserName();
userName.getButton().doClick();
System.out.println(userName.getUserName());

然后它打印“bob”

所以你的问题可能是:

  • 你在onDataChange之前调用getUserName
  • 或者你的onDataChange方法没有设置值,因为它没有进入if语句或者你的dataSnapshot.getChildren()是空的,
  • 甚至最后一个孩子中的用户的用户名是一个空字符串(请注意,您的代码总是返回最后一个孩子的用户名,这是inteded吗?)

【讨论】:

  • 数据检索不是问题,因为当我在ValueEventListener 中使用Log.i("userName",userName); 时,它成功打印了正确的用户名,但是当我调用getUserName() 函数时,它返回空字符串变量。我在我的活动中将此代码用作userName = new UserName(userID).getUserName();,我假设由于我先调用UserName() 构造函数,然后调用getUserName() 函数,我应该得到正确的用户名,我可以通过Log.i() 函数打印它.
  • 抱歉,我不知道回调方法的工作原理。我想不出我的代码的问题是由于代码执行的顺序造成的。感谢您的帮助和时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多