Самостоятельное обновление каждые 10 секунд виджетом проблемы Handler.postDelayed - PullRequest
3 голосов
/ 29 ноября 2010

Я пытаюсь заставить функционировать самообновляющуюся функцию в виджете 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 при выключении экрана. Но, похоже, это не исправит.

Эта проблема сводит меня с ума на одну неделю, поэтому я в отчаянии спрашиваю: есть ли способ сделать это правильно?

1 Ответ

2 голосов
/ 14 марта 2011

Ваш вызов postDelayed находится не внутри вашего блока if (screenEnabled), поэтому он будет продолжать публиковать события, даже если screenEnabled имеет значение false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...