Различные результаты обработчика событий в методе и вне - PullRequest
0 голосов
/ 14 мая 2019

Я использую 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 Ответ

1 голос
/ 15 мая 2019

Вы не можете вернуть то, что еще не было загружено. Другими словами, вы не можете просто вернуть целое число prediction как результат метода или просто использовать его вне метода onSuccess(), поскольку оно всегда будет иметь начальное значение из-за асинхронного поведения этого метода. Это означает, что к тому времени, когда вы пытаетесь вернуть этот результат или использовать его вне обратного вызова, предсказание еще не завершило работу, и поэтому оно недоступно.

Для быстрого решения этой проблемы можно использовать целое число prediction только внутри метода onSuccess(), в противном случае я рекомендую вам просмотреть последнюю часть моего ответа из этого сообщения , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания. Оба ресурса предназначены для базы данных реального времени Firebase, но в вашем случае применяются те же правила.

...