我有课UserName
创建它的目的是在提供 userID 时返回 userName。问题是我无法更改实例变量 userName
匿名类内部 ValueEventListener
。 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;
}
}
最佳答案
如果您在调用 onDataChange
方法之后调用 getUserName
,则该代码应该可以工作。
这里是一个示例,说明它使用 JButton
和 ActionListener
工作
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()
为空, - 甚至最后一个子级中的用户的用户名是一个空字符串(请注意,您的代码始终返回最后一个子级中的用户名,这是有意的吗?)
关于java - 如何更改匿名类中的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59251586/