问候,
我正在尝试编写一个显示Epoch时间的时钟小部件,我需要它每秒更新一次。目前我正在使用使用Handler的服务来执行此操作:
public class EpochService extends Service {
private static final String TAG = "EpochService";
// the time
private static long mTime;
// ui components
private static RemoteViews mViews;
private static ComponentName mComponent;
private static AppWidgetManager mManager;
// handler
private static Handler mHandler = new Handler();
@Override
public void onStart(Intent intent, int id){
Log.i(TAG, "start");
// register the receiver
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(mIntentReceiver, filter);
// set up ui
mViews = new RemoteViews(this.getPackageName(), R.layout.main);
mManager = AppWidgetManager.getInstance(this);
mComponent = new ComponentName(this, Clock.class);
// start
mHandler.removeCallbacks(mEpochTimerTask);
mHandler.postDelayed(mEpochTimerTask, 1000);
}
@Override
public void onDestroy(){
// unregister receiver to prevent memory leak
mHandler.removeCallbacks(mEpochTimerTask);
unregisterReceiver(mIntentReceiver);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
/**
* The broadcast receiver - handles screen off events to stop drawing
*/
private static BroadcastReceiver mIntentReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
Log.i(TAG, "stop drawing");
mHandler.removeCallbacks(mEpochTimerTask);
}
else {
Log.i(TAG, "start drawing");
mHandler.removeCallbacks(mEpochTimerTask);
mHandler.postDelayed(mEpochTimerTask, 1000);
}
}
};
/**
* Run the Epoch Timer
*/
private static Runnable mEpochTimerTask = new Runnable(){
@Override
public void run() {
Log.i(TAG, "run");
mTime = System.currentTimeMillis() / 1000;
mViews.setTextViewText(R.id.time, Long.toString(mTime));
mManager.updateAppWidget(mComponent, mViews);
mHandler.postAtTime(mEpochTimerTask, SystemClock.uptimeMillis() + 1000);
}
};
}
我遇到的问题是,随着时间的推移,我的主屏幕似乎明显变得迟钝。我对Android很新,所以我不确定我正在做的是正确的方法,还是有更好的方法来实现这一点(也许是使用AsyncTask?)。有没有办法经常更新窗口小部件而不会受到UI延迟的影响?如果我需要发布更多代码,请告诉我。我的小部件只是启动和停止此服务,我的appwidget-provder有android:updatePeriodMillis =“0”。
提前感谢您的帮助。
答案 0 :(得分:1)
我正在尝试编写一个时钟小部件 显示大纪元时间,我需要它 每秒更新一次。
请不要。您的用户会用干草叉攻击您。每秒进行一次远程过程调用会大大降低设备的速度并耗尽电池电量。
如果您希望主屏幕上的时钟每秒更新一次,请编写自定义主屏幕,这样一切都可以在一个过程中完成。
我遇到的问题就是结束了 时间,我的主屏幕似乎得到了 显着滞后。
这是可以预期的。
有没有办法更新小部件 经常不受UI的影响 滞后?
没有。默认更新频率是每30分钟,而不是每秒。