我一直在遵循制作Android应用小部件的教程,但遇到了一些麻烦.本教程使我创建了以下代码:
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.
缺口
解决方法:
首先,您不能使用计时器.一旦onUpdate()返回,您的AppWidgetProvider和Timer将被垃圾回收.
其次,请不要每秒更新一次应用小部件. android:updatePeriodMillis至少有30分钟的时间是有原因的-将更新推送到应用小部件是一项昂贵的操作.每秒更新一次,不仅会迫使您的“更新应用程序小部件”代码有效地驻留在内存中并一直在运行,而且您还将大大消耗用户的电量.
要定期更新应用程序小部件,请使用android:updatePeriodMillis或使用AlarmManager.