3

私は、Androidウィジェットの自己更新機能を機能させようとしています。これは、10秒ごとに2つのTextViewを変更するだけの簡単な機能です。理想的な解決策は、それを魔神ウィジェット(ニュースと天気)に似せることです。これまでのところ、問題なく動作します。Handler.postDelayedのRunnableを介して10秒ごとに更新されます。

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は、最初はWidgetクラスのonUpdateメソッドで起動されます。

    @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
}

誰かがそれが役に立つと思う場合に備えて、私はこれを置きます。

しかし、要点を簡単に説明します。電話をスリープ状態から解除すると(画面をオンにすると)、ウィジェットがおかしくなり、早送りのような効果でTextViewを変更し始めます。キューにpostDelayedイベントがあるか、updateAppWidgetキューにある可能性があるためだと思います。私はすでにここに示されているコードを使用して回避策を試しました:http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/ あなたはそれを見ることができますコードの最初のスニペットでは、画面がオフになっているときにpostDelayedを使用しないように、画面の状態を格納しているブール変数をチェックします。しかし、それはそれを修正していないようです。

この問題は私を1週間夢中にさせているので、私は絶望から尋ねます:これを適切に行う方法はありますか?

4

1 に答える 1

2

postDelayed呼び出しはif(screenEnabled)ブロック内にないため、screenEnabledがfalseの場合でもイベントを送信し続けます

于 2011-03-14T19:25:35.343 に答える