我正在使用音乐控件创建通知。一切都很好,除了艺术品更新。
原始艺术品位图大概是 1024x1024 像素左右。如果我直接为我的 RemoteViews 调用 setImageBitmap(, ),它会导致滞后。如果我试图通过 Bitmap#create() 创建新的、更小的位图,那么仍然存在滞后。
那么,我做错了什么?
我正在使用音乐控件创建通知。一切都很好,除了艺术品更新。
原始艺术品位图大概是 1024x1024 像素左右。如果我直接为我的 RemoteViews 调用 setImageBitmap(, ),它会导致滞后。如果我试图通过 Bitmap#create() 创建新的、更小的位图,那么仍然存在滞后。
那么,我做错了什么?
布雷特是对的。但是,它看起来更像是一个错误而不是一个功能。
我没有重新使用具有不同位图的相同 RemoteView,而是每次使用新位图重新创建 RemoteView,然后将其发送到通知。奇怪的是,这不会造成太大的延迟。
我也遇到过这个。SetImageBitmap 很昂贵,因为它必须跨 IPC 边界编组位图。这需要一个大的分配,以便将位图存储在 IPC 消息中,然后是大块内存的实际编组。每次使用时,您几乎都会看到 GC_FOR_ALLOC 消息setImageViewBitmap
。这是一个抢占式 GC(世界停止),这可能是您的滞后的来源。
理想情况下,您应该使用setImageViewUri
file:// Uri,这可以缓解上述 IPC 问题并且相当快。
因此,底线是,如果您设置任何显着尺寸的位图(即大于小图标),您将看到这种滞后。