有人能告诉我每分钟更新小部件的最佳方法吗?
现在我正在使用AppWidget内部的线程,但有时会出现错误“FAILED BINDER TRANSACTION !!!”。 在那个错误之后,我总是一直得到很多类似的错误,而且我再也不能改变我的小部件中的视图了。
谢谢
有人能告诉我每分钟更新小部件的最佳方法吗?
现在我正在使用AppWidget内部的线程,但有时会出现错误“FAILED BINDER TRANSACTION !!!”。 在那个错误之后,我总是一直得到很多类似的错误,而且我再也不能改变我的小部件中的视图了。
谢谢
与在AppWidget中使用线程相比,您最好使用AlarmManager来安排重复的AppWidget更新意图,以便您的代码可以适当地处理。
这种方法的好处是可以配置更新速率,并处理设备睡眠的情况(不会唤醒运行您的代码,甚至因为您的线程繁忙而被阻止入睡)。
有许多示例在互联网上,应该解释了如何使用AlarmManager来引发您的AppWidget更新意图的细节。
BroadcastReceiver _broadcastReceiver;
private final SimpleDateFormat _sdfWatchTime = new SimpleDateFormat("HH:mm");
private TextView _tvTime;
@Override
public void onStart() {
super.onStart();
_broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context ctx, Intent intent) {
if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0)
_tvTime.setText(_sdfWatchTime.format(new Date()));
}
};
registerReceiver(_broadcastReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
}
@Override
public void onStop() {
super.onStop();
if (_broadcastReceiver != null)
unregisterReceiver(_broadcastReceiver);
}
不过,不要忘记在此之前初始化您的TextView(为当前系统时间),因为很可能您会在一分钟内弹出UI,而TextView直到下一分钟才会更新。
AppWidgetProvider
或任何其他BroadcastReceiver
安全地分叉线程。请不要这样做。 - CommonsWare