2013-02-27 3 views
2

Я создал приложение, которое включает около 600 небольших файлов ogg. Всего около 15 МБ. У каждого файла будет avg. звука 6 секунд. Это не игровое приложение, а обучающее приложение для детей.BpMemoryHeap проблема с приложением, которое включает soundpool

Я попытался загрузить звуки на Media Player. Он отлично работает один раз, и когда он постоянно играет, я не получаю никакого звука. Он пуст.

Так что я попробовал звуковой пул. Звуки воспроизводятся только после того, как он загружается в soundpool loader. поэтому я попытался загрузить звуки в начале приложения. Таким образом, загрузка этих звуков занимает около 30 секунд, после чего появляется главный экран (я загружаю звуки с использованием Async в фоновом режиме, а индикатор прогресса отображается спереди).

Эта установка работает просто отлично на около 450 Ogg файлов при добавлении один звук более чем 450 я получаю ошибку кучи на погрузочной пару звуков и приложение силы закрывается ниже ошибки:

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) 

Как я исправить эту проблему? большая часть проблемы с кучей связана с курсором базы данных, а не с soundpool.

Если это невозможно решить, что такое работа с использованием soundpool, когда у меня есть 600 звуков для загрузки?

Спасибо!

+0

Есть ли способ разбить загрузку файла в логические сегменты? Нужно ли загружать все 600 одновременно? Например, если у вас есть три режима воспроизведения, можете ли вы загружать только звуки, необходимые для каждого режима после его выбора? – Geobits

+0

Я пробовал это сделать .. Например. У меня есть 3 модуля. Каждый раз, когда я нажимаю на каждый модуль, я использовал загруженные звуки, но потом я ожидал, что звуки загрузятся, а затем экран появится. Что на самом деле не является удобным для пользователя? – TheDevMan

+0

Честно говоря, ни одно из 30-ти секундного запуска, особенно для детской игры. Ответ alex ниже, вероятно, является хорошим решением для вас. – Geobits

ответ

2

С помощью этого большого количества файлов вы захотите ленить загрузить их и сбросить те, которые не использовались в то время.

В Android есть LruCache, который поможет вам там.

+0

Спасибо, Алекс. Можете ли вы дать представление о том, что мне делать с LRUCache и Soundpool? – TheDevMan

+0

Используйте LruCache, чтобы хранить звуки вместо Soundpool. Материал, который меньше используется, будет выселен, а материал, который используется много, останется там. – alex

+0

https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html это о растровых изображениях, но принцип тот же – alex