Привет,Частые Android Виджет Обновления
Я пытаюсь написать часы виджет, который отображает Epoch время и мне нужно обновить каждую секунду. В настоящее время я делаю это с помощью службы, которая использует обработчик:
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?). Есть ли способ часто обновлять виджет, не испытывая отставания в пользовательском интерфейсе? Если мне нужно разместить больше кода, пожалуйста, дайте мне знать. Мой виджет просто запускает и останавливает эту службу, а у моего разработчика приложений - android: updatePeriodMillis = «0».
Заранее благодарим за помощь.
Вы говорите, что нет способа написать виджет часов с секундной стрелкой без написания нового главного экрана? это не кажется правильным. – Jon
«Вы говорите, что нет способа написать виджет часов с секундной стрелкой без написания нового главного экрана?» Верный. Система виджета приложений не предназначена для быстро изменяющихся данных, и один раз в секунду определенно квалифицируется как «быстро меняющийся». – CommonsWare
@CommonsWare так, что делать, если разработчик хочет разработать виджет часов, в котором час, мин, второй дизайн по изображениям. для второго. Необходимо изменить изображение каждую секунду, чтобы реализовать это. Можете ли вы дать какое-либо решение для этого? –