方法和外部事件处理程序的不同结果

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 实时数据库,但同样的规则适用于您的情况。