Timer.scheduleAtFixedRate () частота меняется, если активность не видна - PullRequest
0 голосов
/ 01 октября 2019

У меня есть служба переднего плана в Android с собственным потоком, который в начале работает как положено.

У меня есть onStartCommand () , например:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

            (...)

            t = new Timer();
            t.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    new Handler(Looper.getMainLooper()).post(new Runnable() {
                        @Override
                        public void run() {
                            myMethod(code);
                        }
                    });
                }
            },0,5000);
            return START_STICKY;

        }

В myMethod () я проверяю, что каждые 5,0 точных секунд он вызывается.

Проблема заключается в следующем:

После того, как в моей MainActivity onPause () и onStopПри вызове методов () служба продолжает работать, как ожидалось, , но myMethod () вызывается не каждые 5,0 секунд. Теперь, возможно, вызывается дважды или 3 раза в одну и ту же секунду, затем один раз, через 7 секунд и т. Д. С явно случайной частотой.

Я думал, что, возможно, запускается новый поток (но не знаю, как,так как onStartCommand () должен вызываться только один раз в соответствии с документами AFAIR, и я проверил, что он вызывается один раз), но в myMethod () я проверяю с помощью Thread.currentThread (). getId (), что каждый раз кажется, что это один и тот же поток.

Как я и проверил, в моем сервисе не вызываются специальные методы, такие как onCreate (), onTaskRemoved (), onLowMemory (), onDestroy () ...

И я не надеваюдействительно не знаю, что проверить на Таймере, Обработчике или Лупере, чтобы найти еще несколько подсказок и пойти дальше.

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ

Когда активность снова видна пользователю, таймер снова работает идеально каждые 5,0 секунд. Поэтому лучше сказать, что это происходит после метода onStop (), я бы сказал, что это происходит, когда действие выполняется в фоновом режиме.

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