Я пытаюсь заставить функционировать самообновляющуюся функцию в виджете Android, что-то простое, например, менять два его TextViews каждые 10 секунд. Идеальным решением было бы сделать его похожим на виджет джиннов (новости и погода). И пока, все работает нормально: обновляется каждые 10 секунд через Runnable Handler.postDelayed.
Runnable updateWidgetText = new Runnable()
{
@Override
public void run() {
if (screenEnabled) {
AppWidgetManager gm = AppWidgetManager.getInstance(ctx);
ComponentName thisWidget = new ComponentName(ctx,AnimeUndergroundWidget.class);
int index = (int)(REFRESH_COUNT % WIDGET_NEWS_TO_SHOW);
Noticia n = AUnder.single().getNoticiaByIndex(index);
if (n!=null)
{
last = n;
RemoteViews views = new RemoteViews(ctx.getPackageName(),R.layout.auwidget);
views.setTextViewText(R.id.widget_textview, n.getTitulo());
views.setTextViewText(R.id.widget_textototal, n.getTexto().replace("\n", ""));
Intent clickintent = new Intent(INTENT_GO_TO_NEW);
PendingIntent pendingIntentClick = PendingIntent.getBroadcast(ctx, 0, clickintent, 0);
views.setOnClickPendingIntent(R.id.widget_fondo_titulo, pendingIntentClick);
Intent click2intent = new Intent(INTENT_GO_TO_NEW);
PendingIntent pendingIntentClick2 = PendingIntent.getBroadcast(ctx, 0, click2intent, 0);
views.setOnClickPendingIntent(R.id.widget_fondo_Texto, pendingIntentClick2);
gm.updateAppWidget(thisWidget, views);
}
REFRESH_COUNT++;
}
handler.removeCallbacks(this);
handler.postDelayed(this, WIDGET_REFRESH_TIME*1000);
}
};
Runnable изначально запускается в методе onUpdate моего класса Widget:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
ctx = context;
context.startService(new Intent(context, UpdateWidgetService.class));
handler.postDelayed(updateWidgetText,WIDGET_REFRESH_TIME*1000);
// here goes some more code, updating the views and refreshing click intents
}
Я поставлю это на тот случай, если кто-то найдет это полезным.
Но позвольте мне перейти непосредственно к вопросу: когда я выхожу из спящего режима (включаю экран), виджет сходит с ума и начинает изменять TextViews с эффектом fastforward.
Я предполагаю, что это потому, что в очереди есть некоторые события postDelayed, или они могут быть в очереди updateAppWidget.
Я уже пробовал обходной путь, используя код, показанный здесь: http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/
Вы можете увидеть это в первом фрагменте моего кода, я проверяю логическую переменную, в которой хранится состояние экрана, чтобы избежать использования postDelayed при выключении экрана. Но, похоже, это не исправит.
Эта проблема сводит меня с ума на одну неделю, поэтому я в отчаянии спрашиваю: есть ли способ сделать это правильно?