У меня была та же проблема, что я не смог обновить уведомление индикатора выполнения даже с интервалом в 3 секунды, поэтому после часов копания я осознал тот факт, что всякий раз, когда мы обновляем уведомление, объект RemoteView должен быть повторносоздается и повторно инициализируется в contentView объекта Notification.После этого я смог обновить индикатор выполнения уведомлений с интервалом 100-500 мс в течение очень длительного периода, не сталкиваясь с блокировкой пользовательского интерфейса.
Примечание. Если вы не согласны, вы можете проверитьэтот ответ, запустив этот фрагмент после комментирования отмеченной строки и увидеть разницу.Это может занять около 5 минут, чтобы начать серьезную блокировку пользовательского интерфейса, которая нагревает ваше устройство и может перестать функционировать.Я попытался с S3 mini с Android 4.2.2, и метод updateNotification (....) был вызван из рабочего потока внутри службы.Более того, я уже дважды проверил его и не знаю, что происходит, когда Notification.Builder используется для той же цели.
Примечание. Причина написания этого ответа после 3 лет вопроса заключается в том, чтоИнтересно, что я не нашел ни одного ответа на стеке или другого сообщения в блоге, где рассматривается эта серьезная проблема с помощью этого очень простого решения.
Я надеюсь, что этот ответ будет полезен для других новичков, таких как я.Наслаждайтесь.
Вот мой скопированный код, который вы можете использовать напрямую .... Я использую тот же код для обновления макета уведомлений, который содержит два ProgressBars и четыре TextView с частотой 500 мс-100 мс.
//long mMaxtTimeoutNanos = 1000000000 // 1000ms.
long mMinTimeNanos = 100000000;//100ms minimum update limit. For fast downloads.
long mMaxtTimeoutNanos = 500000000;//500ms maximum update limit. For Slow downloads
long mLastTimeNanos = 0;
private void updateNotification(.....){
// Max Limit
if (mUpdateNotification || ((System.nanoTime()-mLastTimeNanos) > mMaxtTimeoutNanos)) {
// Min Limit
if (((System.nanoTime() - mLastTimeNanos) > mMinTimeNanos)) {
mLastTimeNanos = System.nanoTime();
// instantiate new RemoteViews object.
// (comment out this line and instantiate somewhere
// to verify that the above told answer is true)
mRemoteView = new RemoteViews(getPackageName(),
R.layout.downloader_notification_layout);
// Upate mRemoteView with changed data
...
...
// Initialize the already existing Notification contentView
// object with newly instatiated mRemoteView.
mNotification.contentView = mRemoteView;
mNotificationManager.notify(mNotificatoinId, mNotification);
mUpdateNotification = false;
}
}
}