Я разрабатываю приложение, которое загружает файлы.У меня есть уведомление, которое отслеживает ход каждой загрузки, и несколько файлов могут быть загружены одновременно.Когда отображается одно уведомление, проблемы не возникают.Однако, когда несколько уведомлений отображаются одновременно, они перестают обновляться при достижении определенной точки.
Вот соответствующий код, который я использую для обновления уведомлений:
private static volatile int _id = 1312;
private int notifId;
private DownloadState state;
private Context context;
private NotificationManagerCompat _notifs;
private NotificationCompat.Builder _builder;
public DownloadNotifier(Context cxt, DownloadState _state) {
context = cxt;
state = _state;
state.setListener(this);
notifId = _id++;
_notifs = NotificationManagerCompat.from(context);
createNotify();
_notifs.notify(notifId, _builder.build());
}
public void createNotify() {
_builder = new NotificationCompat.Builder(context, NOTIF_CHANNEL)
.setContentTitle(DownloadState.Status.getString(state.getStatus()))
.setContentText(state.getTitle())
.setSmallIcon(android.R.drawable.stat_sys_download)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setProgress(100, 0, false)
.setOngoing(true);
}
private int _pUpdates = 0;
@Override
public void onProgress(DownloadState state) {
if (state.getStatus() != DownloadState.Status.DOWNLOADING)
return;
if (_pUpdates % 10 == 0 || state.getProgress() == state.getSize()) {
_builder.setContentTitle(DownloadState.Status.getString(state.getStatus()));
_builder.setProgress((int) state.getSize(), (int) state.getProgress(), false);
_builder.setContentText(state.getTitle() + " (" + DownloadState.getHumanReadableSize(state.getProgress()) + "/" + DownloadState.getHumanReadableSize(state.getSize()) + ")");
_notifs.notify(notifId, _builder.build());
}
_pUpdates++;
}
@Override
public void onStatus(DownloadState state) {
if (_builder == null)
return;
_builder.setContentTitle(DownloadState.Status.getString(state.getStatus()));
if (state.getStatus() != DownloadState.Status.DOWNLOADING)
_builder.setProgress(0, 0, true);
if (state.getStatus() == DownloadState.Status.COMPLETE) {
_builder.setSmallIcon(android.R.drawable.stat_sys_download_done);
_builder.setOngoing(false);
_builder.setProgress(0, 0, false);
state.setListener(null);
}
Log.e("Notif", "Download state change " + DownloadState.Status.getString(state.getStatus()) + " (" + notifId + ").");
_notifs.notify(notifId, _builder.build());
}
Всякий раз, когдаonProgress
вызывается обратный вызов, уведомление успешно обновляется, как и ожидалось.Тем не менее, когда вызывается обратный вызов onStatus
, уведомление не может измениться, если видимы более одного уведомления, отправленного этим кодом.Я не вижу причин, по которым это должно происходить.
Я уверен, что обратный вызов onStatus
является последним из вызываемых (т. Е. Метод onProgress
не запускается после метода onStatus
, поэтому необновление уведомления, как если бы метод onStatus
никогда не выполнялся).
Logcat также успешно сообщает о сообщении "Download state change..."
, поэтому я знаю, что выполняется обратный вызов, и я поставил точку останова в операторе state.getStatus() == DownloadState.Status.COMPLETE
if дляубедитесь, что это условие действительно выполняется, и код в этом операторе был запущен (и был)уведомление (т. е. индикатор выполнения все еще отображается, заголовок не изменяется и т. д.).
Примечание. Эта проблема, по-видимому, относится только к Android Oreo.