Доступ к переменным из внутреннего класса

Я создал функцию для проверки состояния забора в Awareness API. Но мне нужно вернуть результат. Итак, я объявил логическое значение, но оно требует, чтобы я объявил его окончательным. Можете ли вы помочь мне с решением, как вернуть это значение?

public static boolean isFencesActive(final Context context) {

    boolean isActive;

    Awareness.getFenceClient(context).queryFences(FenceQueryRequest.forFences(Arrays.asList(Constans.DETECTION_FENCE_DRIVING, Constans.DETECTION_FENCE_WALKING)))
            .addOnSuccessListener(new OnSuccessListener<FenceQueryResponse>() {

                @Override
                public void onSuccess(FenceQueryResponse fenceQueryResponse) {

                    FenceStateMap map = fenceQueryResponse.getFenceStateMap();
                    isActive = !map.getFenceKeys().isEmpty(); //Needs to be final
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {

                    Log.d(TAG, "Failed: " + e);
                    isActive = false;
                }
            });

    return isActive;
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

@Dim, вы должны использовать, как показано ниже (используя это, чтобы достичь того, чего хотите):

public static void isFencesActive(final Context context) {
   Awareness.getFenceClient(context).queryFences(FenceQueryRequest.forFences(Arrays.asList(Constans.DETECTION_FENCE_DRIVING, Constans.DETECTION_FENCE_WALKING)))
            .addOnSuccessListener(new OnSuccessListener<FenceQueryResponse>() {

                @Override
                public void onSuccess(FenceQueryResponse fenceQueryResponse) {

                    FenceStateMap map = fenceQueryResponse.getFenceStateMap();
                    if (!map.getFenceKeys().isEmpty()){
                      //Perform your operation here is the better way
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d(TAG, "Failed: " + e);
                }
            });
}

Пожалуйста, не просто вставляйте блок кода, а объясните, что вы сделали для решения проблем, с которыми столкнулся исходный плакат.

Ben 07.06.2018 12:25

Это обходной путь, а не реальное решение. А также я считаю, что OnSuccessListener выполняется асинхронно, и существует большая вероятность того, что isActive [0] вернется до того, как он будет установлен, и вы получите неожиданный результат

Amit Bera 07.06.2018 12:25

Это может вам помочь. Объявите переменную boolean isActive; глобально.

Ответ принят как подходящий

После некоторого размышления я понял, что это асинхронная задача, и поэтому я получаю false. Я создал обратные вызовы, которые отправляют эту информацию в мою деятельность.

Другие вопросы по теме