0

可能是一个新手问题。我尝试过使用 android AppWidgetProvider onUpdate 方法并使用“睡眠”来引起一点延迟。

使用循环重复更新 - 事情是这样的:循环计数器设置为 20,睡眠时间为 1 秒 - 循环只执行 10 次 - 900 毫秒每秒延迟增加循环到 12,延迟 500 毫秒获得完整循环计数 20。这是如何解释的?

请参阅下面的 AppWidgetProvide 代码。该小部件仅包含一个文本视图。

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只是一个便利类。它只是简单地包裹 aBroadcastReceiver并解释小部件广播,然后调用适当的方法onUpdate()等等)。

而且 BroadcastReceiver 必须在 10 秒内完成处理广播,否则你会得到ANR

这意味着Thread.sleep()在这里使用是一个坏主意。不要那样做。

目前还不完全清楚你想在这里对我做什么。如果您想每 X 秒更新一次小部件,请使用AlarmManager并定期安排更新意图广播或启动一个新线程来进行计时。

于 2012-04-06T09:53:44.310 回答