2010-10-06 78 views
4

任何人都可以告诉我每分钟更新小部件的最佳方式。如何每分钟更新小部件

现在我使用AppWidget内的线程,但有时我得到错误失败的BINDER TRANSACTION!在那个错误之后,我总是得到很多像这样的错误,而且我无法再改变我的小部件中的视图。

感谢

+1

您无法安全地从AppWidgetProvider或任何其他的BroadcastReceiver分叉线程。请不要这样做。 – CommonsWare 2010-10-06 12:46:17

回答

5

而不是使用在AppWidget一个线程,你将得到更好的使用AlarmManager安排重复AppWidget更新意图,你的代码将妥善处理服务。

这种方法的好处是可以配置更新速率,并且还可以处理设备睡眠的情况(而不是唤醒来运行代码,甚至因为线程繁忙而被阻止进入睡眠状态)。

互联网上有很多examples,应该解释使用AlarmManager来提高你的AppWidget更新意图的来龙去脉。

+1

它还具有将代码保留在RAM外的优点,除非需要时。 – CommonsWare 2010-10-06 12:45:47

+0

我最终使用AlarmManager它的工作.. thankssss – user430926 2010-10-11 07:52:00

2

系统根据系统时钟在每分钟的确切开始处发送广播事件。用你的widget创建一个服务,做这样的事情:

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不会更新。

+0

太棒了!这触发系统时钟更新真棒!非常感谢 – fullMoon 2015-08-01 08:17:13

+0

如何获取指向'_tvTime'的指针,在小部件中,我只有一个'remoteview'并且它设置了'Textview'文本。 – Mneckoee 2016-11-26 05:14:40