Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как правильно сделать виджет, который меняет содержимое каждые 6-8 секунд, Android

Автор вопроса: weakwireОтветов: 2

Ближайший пример того, что я хочу сделать, - это виджет "Engadget". Он обновляет свои данные из Интернета каждые 5-10 минут и "прокручивает" истории каждые 5-7 секунд. Я предполагаю, что он устанавливает интервал 5-10 минут для widget's provider для вызова onUpdate без встроенных ограничений, что-то в этом роде..

AlarmManager alarms = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), updateRateSeconds * 1000, newPending);

Тогда реальная проблема... обновить содержимое виджетов без вызова onUpdate.

Здесь я представляю, что внутри поставщика виджетов существует таймер или Runnable, который каждый раз, когда он вызывается, переназначает себя с чем-то вроде этого

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
...

    mHandler.removeCallbacks(mUpdateTimeTask);
    mHandler.postDelayed(mUpdateTimeTask, 1000);
}

.

private Runnable mUpdateTimeTask = new Runnable() {
           public void run() {

           final long start = mStartTime;
           long millis = SystemClock.uptimeMillis() - start;
           int seconds = (int) (millis / 1000);


           int minutes = seconds / 60;
               seconds     = seconds % 60;
...

     mHandler.postAtTime(this,start + (((minutes * 60) + seconds + 1) * 1000));
}

Затем в провайдере виджетов внутри onDeleted и onDisabled

я удаляю обратные вызовы mHandler.removeCallbacks(mUpdateTimeTask);

Что-то не так с этой схемой? Нужно ли мне создавать службу для обновления виджета оттуда и поддерживать его работоспособность, не устанавливая AlarmManager в конфигурацию виджета? По какой-то причине я получаю двойные вызовы onUpdate, и runnable продолжает работать после того, как я удаляю виджет.

  • Запустите службу, которая отправляет широковещательную рассылку, которую прослушивает виджет. Falmarri 24.09.2010

androidwidget

Ответы

Ответ 1 · рейтинг 1 · adamp

Взгляните на ViewFlipper. Вы можете использовать его для обновления данных один раз для набора элементов, а затем установить, как часто они циклически повторяются.

Ответ 2 · рейтинг 1 · Terrance

Все, что работает непрерывно (например, mp3-плеер или радио) или требует какой-либо формы опроса (будильник, виджет отображения SO, ошибка погоды), должно быть написано как служба. Я знаю, что это устарело, но посмотрите эти видеоролики для получения дополнительной информации о передовых методах
http://developer.android.com/videos/index.html#v=M1ZBjlCRfz0

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы