0

おそらく初心者の質問です。Android AppWidgetProvider onUpdate メソッドで遊んで、「スリープ」を使用して小さな遅延を誘発しようとしました。

更新はループを使用して繰り返されます - これが問題です: ループカウンターが 20 に設定され、スリープ時間が 1 秒の場合 - ループは 10 回しか実行されません - 1 秒の遅延が 900 ミリ秒でループが 12 に増加し、500 ミリ秒の遅延が完全なループを取得しますこれはどのように説明されますか?

以下の AppWidgetProvide コードを参照してください。ウィジェットには、テキストビューが 1 つだけ含まれています。

public class SimpleWidget extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // TODO Auto-generated method stub
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        Log.w("on update here", " message");
        RemoteViews rm = new RemoteViews(context.getPackageName(),
                R.layout.widget_layout);
        for (int loop = 0; loop <= 20; loop++) {
            Log.w("on update here", "loop counter  =" + loop);
            rm.setTextViewText(R.id.tvWidget, "now you see it " + loop);
            for (int index = 0; index < appWidgetIds.length; index++) {

                appWidgetManager.updateAppWidget(appWidgetIds[index], rm);
                Log.w("updating", "aw number  =" + index);
            }
            try {
                Thread.sleep(2000, 0);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
4

1 に答える 1

0

すべての場合で、時間が 10 秒近くになることに注意してください。これは、 anAppWidgetProviderが単なる便利なクラスであるためです。単純に a をラップして、ウィジェットのブロードキャストを解釈し、適切なメソッド(BroadcastReceiverなど) を呼び出しますonUpdate()

また、BroadcastReceiver は 10 秒以内にブロードキャストの処理を終了する必要があります。そうしないと、ANRが発生します。

つまり、ここで使用するThread.sleep()のは悪い考えです。それをしないでください。

あなたがここで私に何をしようとしているのかは完全には明らかではありません。ウィジェットを X 秒ごとに更新する場合は、代わりにAlarmManagerを使用して更新インテント ブロードキャストを定期的にスケジュールするか、新しいスレッドを開始してタイミングを実行します。

于 2012-04-06T09:53:44.310 に答える