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

时间:2019-05-14 16:00:42

标签: android firebase event-handling prediction firebase-mlkit

我正在使用Firebase对我的模型进行预测。通过将事件处理程序传递给FirebaseModelInterpreter可获得结果。事件处理程序之一用于成功案例,另一个用于失败案例。我创建了一个内部类来充当事件处理程序,并且它还具有一个私有字段来存储预测结果。当我在事件处理程序方法中将结果打印到控制台时,没有问题,但是当我尝试在结果更改之外获取此结果时。我不明白为什么。这是我的代码:

        // 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;

1 个答案:

答案 0 :(得分:1)

您现在无法返回尚未加载的内容。换句话说,您不能简单地作为方法的结果返回prediction整数,也不能简单地在onSuccess()方法之外使用它,因为由于该方法的异步行为,它将始终具有初始值。这意味着,当您尝试返回该结果或在回调之外使用它时,预测尚未完成工作,这就是无法访问的原因。

此问题的快速解决方案是仅在prediction方法内使用onSuccess()整数,否则我建议您从此 {{3} } ,其中我解释了如何使用自定义回调来完成。您也可以查看此 post 以获得更好的理解。两种资源都用于Firebase实时数据库,但是在您的情况下适用相同的规则。