[英]How can I change value of variable in side method from anonymous inner class?
如何从匿名内部类更改方法内部变量的值,要访问此变量,它必须是final
,但是如果变量 final 无法更改其值,如何使用 java 解决此问题?
这是我的代码,我想更改addFlag
的值。
public static boolean addUser(UserModle user){
Boolean addFlag ;
dbUser = FirebaseDatabase.getInstance().getReference("user");
Task task = dbUser.child(user.getId()).setValue(user);
task.addOnSuccessListener(new OnSuccessListener() {
@Override
public void onSuccess(Object o) {
addFlag = true;
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
return addFlag;
}
恕我直言, addUser
函数的当前实现存在缺陷。 根据我的理解,您想知道用户是否已根据此函数返回的addFlag
值成功添加到您的addFlag
数据库中。
一旦 Firebase 数据库调用从 Firebase 实时数据库中取回数据, addFlag
将被更新。 但是,您将立即返回标志,因此您无需等待后台网络线程的结果。
为了实现这一点,我想建议一个基于interface
的实现。 您可能有如下interface
。
public interface FirebaseListener {
void onSuccess(boolean flag);
}
然后在addUser
函数中添加一个额外的参数,以从调用此函数的Activity
或Fragment
传递该interface
。 因此,该函数可能如下所示。
// Change the return type to void, as we are not expecting anything from this function.
// Instead, we will wait for the success callback using the interface
public static void addUser(UserModle user, FirebaseListener listener) {
dbUser = FirebaseDatabase.getInstance().getReference("user");
Task task = dbUser.child(user.getId()).setValue(user);
task.addOnSuccessListener(new OnSuccessListener() {
@Override
public void onSuccess(Object o) {
listener.onSuccess(true);
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
listener.onSuccess(false);
}
});
}
现在在您的活动或片段中实现侦听器,如下所示。
public MyActivity extends AppCompatActivity implements FirebaseListener {
// ... Other functions of your activity
@Override
public void onSuccess(boolean flag) {
if (flag) {
// User add successful. Do something here
} else {
// User add not successful. Do something here
}
}
}
现在,在调用addUser
函数时,您应该将回调侦听器与它一起传递,如下所示。
addUser(user, this);
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.