Как получить информацию из API Google во время функции onUpdate виджета?

Я пытаюсь создать виджет для Android, который показывает информацию из API Google, в частности API фитнеса. Прямо сейчас клиент Fitness API (объект GoogleAPIClient) настроен в основной активности как общедоступная статическая переменная, и функция onUpdate получает ее, вызывает .connect(), а затем пытается получить информацию из этого API. Он работает, но только когда активна основная активность приложения. Если я его закрою, то при следующем обновлении приложения произойдет сбой с ошибкой:

    java.lang.RuntimeException: Unable to start receiver
    Caused by: java.lang.NullPointerException

При вызове .connect() в функции onUpdate().

Есть ли правильный способ сделать это, что мне не хватает? Как мне сделать так, чтобы я мог получать информацию каждый раз, когда вызывается onUpdate, но по-прежнему обрабатывать вызов onConnectionFailed - я должен начать разрешение неудачного соединения (обычно просто предоставляя разрешения приложению или указывая учетную запись) внутри закрывающего Activity, а AppWidgetProvider не является действием, поэтому я не могу просто поместить клиентский объект в Provider, что было моей первой мыслью.

Могу ли я поместить клиента внутрь провайдера, а затем запустить новое действие, чтобы перейти к вызову вызова startResolutionForResult во время onConnectionFailed? Если да, то как мне запустить это намерение, чтобы оно считалось «окружающим классом» - это была ошибка, которую я получил, когда попытался указать Provider в качестве аргумента для startResolutionForResult.

Я новичок как в виджетах, так и в API Google, и все еще новичок в разработке Android в целом, хотя гораздо более опытен в этом, чем в виджетах API. Спасибо за любую помощь.


person James S    schedule 21.06.2015    source источник


Ответы (1)


Есть ли правильный способ сделать это, что мне не хватает?

Попросите onUpdate() делегировать работу Service, позвонив startService(). Попросите эту службу связаться с Fit API. Когда Service получает результаты от Fit API, он обновляет виджет приложения с помощью AppWidgetManager, а затем вызывает stopSelf(), поскольку Service больше не нужен.

person CommonsWare    schedule 21.06.2015
comment
Итак, объявлю ли я подходящего API-клиента и все связанные с ним методы в классе обслуживания? Если да, то как мне запустить действие для обработки вызова onConnectionFailed? Если нет, и я держу клиента в рамках основного действия, как служба решает проблему с нулевым указателем, когда основное действие не активно? - person James S; 22.06.2015
comment
@JamesS: Итак, объявлю ли я подходящий клиент API и все связанные методы в классе обслуживания? -- да. как мне запустить действие для обработки вызова onConnectionFailed? -- вы не начинаете деятельность. Вы делаете это как часть обновления виджета приложения. Пожалуйста, не прерывайте пользователя. Вместо этого поднимите Notification. - person CommonsWare; 22.06.2015