2012-04-06 77 views
0

可能是一个新手问题。我已经尝试玩Android的AppWidgetProvider onUpdate方法,并使用“睡眠”来引起一个小的延迟。Android AppWidget - 奇怪的睡眠模式

使用循环重复更新 - 这是事情:循环计数器设置为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(); 
      } 

     } 
    } 

回答

0

你会注意到在所有情况下时间接近10秒。这是因为AppWidgetProvider只是一个便利课程。它仅包含BroadcastReceiver并解释小部件广播,然后它调用适当的方法onUpdate()等)。

并且BroadcastReceiver必须在10秒内完成处理广播,否则您将获得ANR

这意味着在这里使用Thread.sleep()是个不错的主意。根本不要那样做。

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