涉及声音池的应用程序的 BpMemoryHeap 问题

Posted

技术标签:

【中文标题】涉及声音池的应用程序的 BpMemoryHeap 问题【英文标题】:BpMemoryHeap issue with app that involves soundpool 【发布时间】:2013-02-27 02:06:30 【问题描述】:

我创建了一个包含大约 600 个小 ogg 文件的应用程序。总共大约 15MB。每个文件都会有 avg. 6秒的声音。这不是游戏应用程序,而是儿童学习应用程序。

我尝试在媒体播放器上加载声音。它工作正常一次,当连续播放时,我最终没有声音。它是空白的。

所以我尝试了声音池选项。只有在加载到 soundpool 加载程序后才会播放声音。因此我尝试在应用程序的开头加载声音。所以加载声音大约需要 30 秒,之后会显示主屏幕(我在后台使用异步加载声音,进度条显示在前面)。

当我添加一个超过 450 个声音时,此设置适用于大约 450 个 ogg 文件我在加载几个声音时遇到堆错误,并且应用程序强制关闭并出现以下错误:

 02-27 07:13:02.614: I/Choreographer(27172): Skipped 35 frames!  The application may be doing too much work on its main thread.
 02-27 07:13:11.012: E/IMemory(27172): binder=0x56f0c430 transaction failed fd=-2147483647, size=0, err=-2147483646 (Unknown error 2147483646)
 02-27 07:13:11.012: E/IMemory(27172): cannot dup fd=-2147483647, size=0, err=-2147483646 (Bad file number)
 02-27 07:13:11.012: E/IMemory(27172): cannot map BpMemoryHeap (binder=0x56f0c430), size=0, fd=-1 (Bad file number)
 02-27 07:13:11.020: W/dalvikvm(27172): threadid=37: thread exiting with uncaught exception (group=0x40d75930)
 02-27 07:13:11.153: E/IMemory(27172): cannot dup fd=818, size=1048576, err=0 (Too many open files)
 02-27 07:13:11.153: E/IMemory(27172): cannot map BpMemoryHeap (binder=0x56f09e80), size=1048576, fd=-1 (Bad file number)
 02-27 07:13:11.403: E/IMemory(27172): cannot dup fd=972, size=1048576, err=0 (Too many open files)
 02-27 07:13:11.403: E/IMemory(27172): cannot map BpMemoryHeap (binder=0x56f09988), size=1048576, fd=-1 (Bad file number)
 02-27 07:13:11.450: E/IMemory(27172): cannot dup fd=873, size=1048576, err=0 (Too many open files)
 02-27 07:13:11.450: E/IMemory(27172): cannot map BpMemoryHeap (binder=0x56f0a500), size=1048576, fd=-1 (Bad file number)
 02-27 07:13:11.520: E/IMemory(27172): cannot dup fd=954, size=1048576, err=0 (Too many open files)
 02-27 07:13:11.520: E/IMemory(27172): cannot map BpMemoryHeap (binder=0x56efbde8), size=1048576, fd=-1 (Bad file number)
 02-27 07:13:11.614: W/dalvikvm(27172): threadid=35: thread exiting with uncaught exception (group=0x40d75930)
 02-27 07:13:11.677: E/IMemory(27172): cannot dup fd=903, size=1048576, err=0 (Too many open files)
 02-27 07:13:11.677: E/IMemory(27172): cannot map BpMemoryHeap (binder=0x56f09b30), size=1048576, fd=-1 (Bad file number)
 02-27 07:13:11.716: E/IMemory(27172): cannot dup fd=978, size=1048576, err=0 (Too many open files)
 02-27 07:13:11.716: E/IMemory(27172): cannot map BpMemoryHeap (binder=0x5d99add0), size=1048576, fd=-1 (Bad file number) 
 02-27 07:13:11.747: E/IMemory(27172): cannot dup fd=941, size=1048576, err=0 (Too many open files)
 02-27 07:13:11.747: E/IMemory(27172): cannot map BpMemoryHeap (binder=0x56efb710), size=1048576, fd=-1 (Bad file number)
 02-27 07:13:11.809: E/IMemory(27172): cannot dup fd=991, size=1048576, err=0 (Too many open files)
 02-27 07:13:11.809: E/IMemory(27172): cannot map BpMemoryHeap (binder=0x56efaa90), size=1048576, fd=-1 (Bad file number)

我该如何解决这个问题? Heap 上的大部分问题是关于数据库游标而不是 soundpool。

如果这无法解决,当我有 600 个声音要加载时,使用 soundpool 的解决方法是什么?

谢谢!

【问题讨论】:

有没有办法将文件加载分解成逻辑段?是否需要一次加载所有 600 个?例如,如果您有三种播放模式,您是否可以在选择每种模式后只加载每种模式所需的声音? 我试过这样做..例如我有 3 个模块。每次我单击每个模块时,我都会使用加载所需的声音,但是我必须等待声音加载然后屏幕出现。哪个实际上不是用户友好的权利? 老实说,30 秒的启动时间都不是,尤其是对于儿童游戏。不过,alex 下面的回答可能对您来说是一个很好的解决方案。 【参考方案1】:

有了这么多文件,您将需要延迟加载它们并转储一段时间未使用的文件。

android 中有一个 LruCache 可以帮助您。

【讨论】:

谢谢亚历克斯。你能告诉我应该如何使用 LRUCache 和 Soundpool 吗? 使用 LruCache 代替 Soundpool 来存储你的声音。使用较少的东西将被驱逐,而经常使用的东西将保留在那里 developer.android.com/training/displaying-bitmaps/…这是关于位图的,但原理是一样的 但是声音池是用来播放声音的。我无法使用媒体播放器。如果我使用 LRUCache 加载声音.. 怎么玩? 为什么不能使用MediaPlayer?

以上是关于涉及声音池的应用程序的 BpMemoryHeap 问题的主要内容,如果未能解决你的问题,请参考以下文章

关于Binder连接池的跨应用使用方法

通过micrometer实时监控线程池的各项指标

java多线程--线程池的使用

揭秘池化技术--内存池的实现

线程池的设计原理是什么?

设计一个可靠的连接池