Частые обновления виджетов Android - PullRequest
2 голосов
/ 24 мая 2010

Привет,

Я пытаюсь написать виджет часов, который отображает время эпохи, и мне нужно, чтобы он обновлялся каждую секунду. В настоящее время я делаю это с помощью службы, которая использует обработчик:

 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?). Есть ли способ часто обновлять виджет, не страдая от лаги интерфейса? Если мне нужно разместить больше кода, пожалуйста, дайте мне знать. Мой виджет просто запускает и останавливает этот сервис, а мой appwidget-provder имеет android: updatePeriodMillis = "0".

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 24 мая 2010

Я пытаюсь написать виджет часов который отображает время эпохи и мне это нужно обновлять каждую секунду.

Пожалуйста, не надо. Ваши пользователи будут атаковать вас вилами. Выполнение удаленного вызова процедуры каждую секунду значительно замедлит работу устройства и разрядит аккумулятор.

Если вы хотите, чтобы часы на главном экране обновлялись каждую секунду, напишите собственный начальный экран, чтобы все это можно было сделать за один процесс.

Проблема, с которой я столкнулся, заключается в том, что время, мой домашний экран появляется, чтобы получить заметно отстает.

Этого следовало ожидать.

Есть ли способ обновить виджет часто без страданий от пользовательского интерфейса лаг?

Нет. Периодичность обновления по умолчанию - каждые 30 минут, а не каждую секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...