Страницы

Поиск по вопросам

понедельник, 25 февраля 2019 г.

Как красиво вернуть переменную через return

Допустим у меня есть метод с слушателем (для примера выбрал запрос к VK Api, он был под рукой):
private void getSubscribersInGroup() throws Exception { //Устанавливается пауза, чтобы код не выполнялся, пока //не будет получен ответ в слушатель isPause = true;
//Создаю запрос (указываю что мне нужно получить) final VKRequest request = VKApi.groups().getMembers(VKParameters.from( VKApiConst.GROUP_ID, groupId, VKApiConst.COUNT, 0));
//Посылаю запрос и устанавливаю слушатель с методами request.executeWithListener(new VKRequest.VKRequestListener() { @Override public void onComplete(VKResponse response) { //Обрабатываю ответ и получаю его в ГЛОБАЛЬНУЮ переменную subscribersCount = getCountFromJSON(response.responseString); //Отключаю паузу, чтобы код продолжился isPause = false; }
@Override public void onError(VKError e) { //По скольку это метод из API, я не могу выбрасывать Exception, //приходится прибегать к такому варианту isError = true; error = "error when requesting count: " + e.errorMessage; isPause = false; }
@Override public void attemptFailed(VKRequest request, int attemptNumber, int totalAttempts) { //Аналогично предыдущему методу isError = true; error = "onAttemptFailed when requesting count: " + "attemptNumber = " + attemptNumber + "totalAttempts = " + totalAttempts; isPause = false; } });
//Метод просто вызывает в бесконечном цикле "wait" на 100 миллисекунд, //с условием (isPause) waitResponseFromServer(); //Если была ошибка — кидаю исключение if (isError) throw new Exception(error); }
Я хочу вернуть переменную count через return, а не использовать глобальную переменную. Методы слушателя имеют доступ только к final переменным метода, поэтому я не могу напрямую обращаться к ним. Android Studio предложила вариант сделать переменную count массивом — final int[] count = new int[1];, а потом работать с первым элементом массива. Как по мне, это немного не очевидный ход, который мне не сильно нравится. Есть еще варианты вернуть из метода переменную subscribersCount так, чтобы не использовать глобальную переменную?


Ответ

У вас не получится вернуть переменную через return, так как запрос происходит асинхронно. Вы можете передавать в этот метод listener
private void getSubscribersInGroup(final OnSubscriptionListener listener)
где OnSubscriptionListener:
public interface OnSubscriptionListener { void onUpdateSubscribersCount(int subscribesCount); }
и вызывать его внутри onComplete (VKResponse response)
request.executeWithListener(new VKRequest.VKRequestListener() { @Override public void onComplete(VKResponse response) { //Обрабатываю ответ и получаю его в ГЛОБАЛЬНУЮ переменную int subscribersCount = getCountFromJSON(response.responseString); if (listener != null) { listener.onUpdateSubscribersCount(subscribersCount); }
//Отключаю паузу, чтобы код продолжился isPause = false; }
Не совсем понятно для каких целей вам ее нужно вернуть именно через return

Комментариев нет:

Отправить комментарий