方法和外部事件处理程序的不同结果
Different Results from Event handler in Method and Outside
我正在使用 firebase 对我的模型进行预测。通过将事件处理程序传递给 FirebaseModelInterpreter 获得结果。其中一个事件处理程序用于成功案例,另一个用于失败案例。我创建了一个内部 class 作为事件处理程序,它还有一个私有字段来存储预测结果。当我在事件处理程序方法中将结果打印到控制台时没有问题,但是当我尝试在结果更改之外获取此结果时。我不明白为什么。这是我的代码:
// Listener for getting prediction
class OnSuccess implements OnSuccessListener<FirebaseModelOutputs>{
private int prediction;
@Override
public void onSuccess(FirebaseModelOutputs result){
float[][] output = result.getOutput(0);
float[] probabilities = output[0];
//find predicted label
int argmax = 0;
for (int i = 1; i < probabilities.length; i++){
if(probabilities[i] > probabilities[argmax])
argmax = i;
}
System.out.println("Argmax is:" + argmax);
this.prediction = argmax;
System.out.println("After setting value:" + getPrediction());
}
public int getPrediction(){
return prediction;
}
}
OnSuccessListener<FirebaseModelOutputs> onSuccessEventHandler = new OnSuccess();
modelInterpreter.run(inputs, inputOutputOptions)
.addOnSuccessListener(onSuccessEventHandler)
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println("Error during prediction");
}
}
);
int prediction = ((OnSuccess) onSuccessEventHandler).getPrediction();
System.out.println("Before returning prediction is:"+prediction);
return prediction;
您现在不能 return 尚未加载的内容。换句话说,您不能简单地将 return prediction
整数作为方法的结果,也不能简单地在 onSuccess()
方法之外使用它,因为由于异步行为,它始终具有初始值这个方法。这意味着当您尝试 return 该结果或在回调之外使用它时,预测尚未完成工作,这就是无法访问的原因。
一个快速解决这个问题的方法是只在 onSuccess()
方法中使用 prediction
整数,否则我建议你从这个 中看到我的答案的最后一部分 in which I have explained how it can be done using a custom callback. You can also take a look at this video 以便更好地理解。这两个资源都适用于 Firebase 实时数据库,但同样的规则适用于您的情况。
我正在使用 firebase 对我的模型进行预测。通过将事件处理程序传递给 FirebaseModelInterpreter 获得结果。其中一个事件处理程序用于成功案例,另一个用于失败案例。我创建了一个内部 class 作为事件处理程序,它还有一个私有字段来存储预测结果。当我在事件处理程序方法中将结果打印到控制台时没有问题,但是当我尝试在结果更改之外获取此结果时。我不明白为什么。这是我的代码:
// Listener for getting prediction
class OnSuccess implements OnSuccessListener<FirebaseModelOutputs>{
private int prediction;
@Override
public void onSuccess(FirebaseModelOutputs result){
float[][] output = result.getOutput(0);
float[] probabilities = output[0];
//find predicted label
int argmax = 0;
for (int i = 1; i < probabilities.length; i++){
if(probabilities[i] > probabilities[argmax])
argmax = i;
}
System.out.println("Argmax is:" + argmax);
this.prediction = argmax;
System.out.println("After setting value:" + getPrediction());
}
public int getPrediction(){
return prediction;
}
}
OnSuccessListener<FirebaseModelOutputs> onSuccessEventHandler = new OnSuccess();
modelInterpreter.run(inputs, inputOutputOptions)
.addOnSuccessListener(onSuccessEventHandler)
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println("Error during prediction");
}
}
);
int prediction = ((OnSuccess) onSuccessEventHandler).getPrediction();
System.out.println("Before returning prediction is:"+prediction);
return prediction;
您现在不能 return 尚未加载的内容。换句话说,您不能简单地将 return prediction
整数作为方法的结果,也不能简单地在 onSuccess()
方法之外使用它,因为由于异步行为,它始终具有初始值这个方法。这意味着当您尝试 return 该结果或在回调之外使用它时,预测尚未完成工作,这就是无法访问的原因。
一个快速解决这个问题的方法是只在 onSuccess()
方法中使用 prediction
整数,否则我建议你从这个 中看到我的答案的最后一部分