我在OnSuccessListener中为变量赋值时遇到问题。正如您在代码中看到的那样,首先,我正在尝试将abc的值写入Listener中的log,然后在侦听器完成工作之后调试相同字符串的值,但在日志文件中我首先看到“ after:null“并且仅在”result = testField“之后。
我想,关键是监听器异步完成任务,但我不知道它什么时候结束。我使用Thread.sleep“修复”了这个问题,但它不是解决方案。有没有人知道将字段值赋值给变量的正确方法?
abstract class Measurement : Cloneable {
abstract val units: String
abstract val value: Number
fun unaryMinus() : Measurement {
val measurement = this.clone() as Measurement
return measurement
}
}
答案 0 :(得分:0)
您使用的是此类操作中常见的接口。我修改了你的代码来演示这个概念。您将以这种方式使用代码:
LoadDBData dataBaseAccessOp=new LoadDBData();
//YOUR original function next
dataBaseAccessOp.getInfo("uidSelected", new LoadingListener(){
@Override
void OnSuccess(String data){
log("result = " + data);
}
@Override
void OnFail(){
log("result = ERROR");
Toast.makeText(applicationManager.activity.getApplicationContext(),
"ERROR", Toast.LENGTH_SHORT).show();
}
});
下面是修改后的代码。
Kf个
public class LoadDBData {
public interface LoadingListener{
void OnSuccess(String data);
void OnFail();
}
private void getInfo(String uid, LoadingListener usrListener) {
DocumentReference doc = FirebaseFireStore.getInstance().document("sb/base");
store.collection("users").document(uid).get().addOnSuccessListener(
new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if (documentSnapshot.exists()==true)
String abc = new JSONObject(documentSnapshot.getData()).toString();
usrListener.OnSuccess(abc);
}
}
}
).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
usrListener.OnFail();
}
}
);
}
}