Как обновлять данные ровно каждые секунды? AlarmManager - PullRequest
0 голосов
/ 15 сентября 2010

Я хочу обновлять свой виджет каждые секунды. Поэтому я использую Service and Alarm Manager, но он обновляется не каждую секунду.

Это мой список журналов:

  09-15 11:16:08.876: INFO/REPEAT(2850): time=11:16:08am
  09-15 11:16:09.970: INFO/REPEAT(2850): time=11:16:09am
  **09-15 11:16:11.025: INFO/REPEAT(2850): time=11:16:11am
  09-15 11:16:11.978: INFO/REPEAT(2850): time=11:16:11am**
  09-15 11:16:13.118: INFO/REPEAT(2850): time=11:16:12am
  09-15 11:16:14.048: INFO/REPEAT(2850): time=11:16:13am
  09-15 11:16:15.900: INFO/REPEAT(2850): time=11:16:15am
  09-15 11:16:16.533: INFO/REPEAT(2850): time=11:16:16am
  09-15 11:16:17.595: INFO/REPEAT(2850): time=11:16:17am
  09-15 11:16:17.845: INFO/REPEAT(2850): time=11:16:17am
  09-15 11:16:18.892: INFO/REPEAT(2850): time=11:16:18am
  09-15 11:16:20.212: INFO/REPEAT(2850): time=11:16:19am
  09-15 11:16:21.025: INFO/REPEAT(2850): time=11:16:20am
  09-15 11:16:21.861: INFO/REPEAT(2850): time=11:16:21am

Это мой код:

public static final int INTERVAL = 1000; // 1 sec
public static final int FIRST_RUN = 0; // 0 seconds

  private void startService() {

    Intent intent = new Intent(this, RepeatingAlarmService.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, REQUEST_CODE, intent, 0);

    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.setRepeating(
            AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime() + FIRST_RUN,
            INTERVAL,
            pendingIntent);

    Toast.makeText(this, "Service Started.", Toast.LENGTH_LONG).show();
    Log.v(this.getClass().getName(), "AlarmManger started at " + new java.sql.Timestamp(System.currentTimeMillis()).toString());
}

RepeatingAlarmService.class:

 public class RepeatingAlarmService extends BroadcastReceiver {
public static final String CUSTOM_INTENT = "time to write";

@Override
public void onReceive(Context context, Intent intent) {

    Log.i("REPEAT","time="+getTimeString());
    Intent i = new Intent();
    i.setAction(CUSTOM_INTENT);
    context.sendBroadcast(i);


}



public static String getTimeString() {
    String result = null;
    Calendar cal = Calendar.getInstance();
    if(cal.get(Calendar.AM_PM) == Calendar.AM)
        result = new String(String.format("%02d:%02d:%02dam", cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE),cal.get(Calendar.SECOND)));
    else
        result = new String(String.format("%02d:%02d:%02dpm", cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE),cal.get(Calendar.SECOND)));
    return result;
}

}

Как я могу решить эту проблему? Мне нужно обновлять все ровно каждые секунды

1 Ответ

2 голосов
/ 15 сентября 2010

Из руководства для Android:

Примечание. Диспетчер тревог предназначен для случаев, когда вы хотите, чтобы код вашего приложения запускался в определенное время, даже если ваше приложение в данный момент не запущено.Для обычных операций синхронизации (тики, тайм-ауты и т. Д.) Проще и гораздо эффективнее использовать Handler.

Вы можете использовать AlarmManager, а не для получения данных с сервера и т. Д. Только для действий, которые должны бытьделается каждые 5/15 минут.

Для анимации используйте Handler.

У меня также есть совет для вас.Не создавайте анимацию на основе фиксированных интервалов.Они будут работать бесперебойно только на машине с ОСРВ>:]. Вы должны рассчитать временной интервал между предыдущими и текущими обновлениями.Используйте временной интервал для имитации следующего кадра.

...