【问题标题】:Why NotificationManager works so slow during the update progress?为什么 NotificationManager 在更新过程中运行缓慢?
【发布时间】:2013-08-04 13:41:56
【问题描述】:

我通过 NotificationManager 发布文件上传进度,但在更新进度时 UI 冻结。

我使用缓存在类字段中的 NotificationCompat.Builder。所以进度发布很简单:

manager.notify(id, uploader.
    setProgress(MAX_PROGRESS, (int) (progress * 100), false).
    build()
);

更新进度保证从主线程执行(包装在 Handler 装饰器中)。

this.request.setCallback(new UploaderDecorator(this.request.getCallback()));

进度公布如下:

long total = file.length();
long uploaded = 0;
int bytesRead = input.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
    output.write(buffer, 0, bufferSize);
    uploaded += bytesRead;
    callback.onUploadProgress(activeFile, ((float) uploaded / total));
    bytesRead = input.read(buffer, 0, bufferSize);
}

那么为什么它的工作这么慢?

【问题讨论】:

  • “更新进度保证从主线程执行(包装在处理程序装饰器中)”——您不需要从主应用程序线程更新Notification。事实上,这可能会导致您的问题。
  • @CommonsWare 移除了装饰器,比较了 id 进程,因为它们是不同的,但问题仍然存在。通知栏中的问题,我的应用程序以相同的速度运行。
  • 可能是因为通知发送太频繁?
  • 我在通知中看到的大多数下载进度条似乎并不经常更新——可能每隔几秒钟更新一次。你肯定有可能淹没NotificationManager,这取决于bufferSize 的大小。
  • 好吧,我当然会使用更大的缓冲区,不管Notification 问题如何,只是为了提高性能。至少 8-16K。

标签: android android-notifications


【解决方案1】:

这是一种常见的行为。您不应该频繁更新通知管理器。您应该确定更新的时间间隔,例如每秒两次。

例如,

long startTime;
long elapsedTime = 0L;

if (elapsedTime > 500) {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            mBuilder.setProgress(100, (int) newValue, false);
            mNotifyManager.notify(notificationID, mBuilder.build());

            startTime = System.currentTimeMillis();
            elapsedTime = 0;
        }
    });

    Log.d("Andrognito", newValue + "Progress");
}
else
    elapsedTime = new Date().getTime() - startTime;

这对我来说非常有效,也不会冻结通知。

【讨论】:

  • 我可以设置的最小间隔是多少,你知道吗?
  • 即使是多个通知也能完美运行!谢谢
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2019-02-26
  • 2019-01-21
相关资源
最近更新 更多