2012-04-06 111 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並定期更新意圖廣播或啓動一個新線程來執行計時。