2010-12-07 74 views
3

我一直在關注製作Android應用小部件的教程,並且遇到了一些麻煩。本教程促使我創建這個代碼:應用小部件更新TextView

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int [] appWidgetIds) { 
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 1000); 
} 

private class MyTime extends TimerTask { 

    RemoteViews remoteViews; 
    AppWidgetManager appWidgetManager; 
    ComponentName thisWidget; 
    DateFormat format = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM, Locale.getDefault()); 

    public MyTime(Context context, AppWidgetManager appWidgetManager) { 
     this.appWidgetManager = appWidgetManager; 
     remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 
     thisWidget = new ComponentName(context, FlipWidget.class); 
    } 

    @Override 
    public void run() { 
     remoteViews.setTextViewText(R.id.widget_text, "Time: "+format.format(new Date())); 
     appWidgetManager.updateAppWidget(thisWidget, remoteViews); 
    } 
} 

但似乎run方法永遠不會被調用,因爲TextView的永遠不會改變。感謝您的幫助,我很樂意處理App Widgets。

尼克

回答

3

首先,你不能使用Timer。一旦onUpdate()返回,您的AppWidgetProviderTimer將被垃圾收集。

其次,請不要每秒更新一個應用程序小部件。 android:updatePeriodMillis有一個原因,至少30分鐘 - 推送應用程序小部件的更新是一個昂貴的操作。每秒更新一次不僅會迫使您的「更新應用程序小部件」代碼有效地駐留在內存中,而且還會一直運行,但是您還會非常顯着地損壞用戶電池。

要定期更新應用部件,請使用android:updatePeriodMillis或使用AlarmManager

+0

好的,謝謝你的幫助。雖然時鐘需要每秒更新一次,但AlarmManager能否讓我有效地做到這一點? – Nick 2010-12-07 17:55:50