【发布时间】: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