2011-09-15 6 views
6

Recibo este error cientos de veces cuando ejecuto Debug, no parece afectar el programa, pero ¿cómo me deshago de él?android soundpool heapsize overflow

sé que se remonta a la soundpool basa en otros puestos

09-15 09: 03: 09,190: ERROR/AudioCache (34): desbordamiento del montón en tamaño! tamaño requerido: 1052672, tamaño máximo: 1048576

+0

A continuación, sólo aumentar su tamaño del montón – RoflcoptrException

+0

cómo lo hago? – GideonKain

+0

http://viralpatel.net/blogs/2009/01/jvm-java-increase-heap-size-setting-heap-size-jvm-heap.html – RoflcoptrException

Respuesta

0

Quizás su recurso de medios sea demasiado grande para jugar con el grupo de sonido. Soundpool solo reproduce efectos de sonido cortos. En la API de Soundpool no hay especificaciones sobre el máximo de un recurso para jugar con el grupo de sonido, pero si lo usa, toque solo efectos de sonido cortos como, por ejemplo, una breve explosión en un juego de disparos. Si este es su problema, debe usar MediaPlayer para reproducir sus sonidos.

10

SoundPool es el código duro del tamaño del búfer como 1 M para todo el archivo cargado. Por lo tanto, es probable que obtenga un error de "desbordamiento del tamaño del montón" al cargar demasiados archivos en SoundPool. También tengo este problema en un proyecto de juego que va a cargar los efectos de sonido del juego en soundpool y la solución es la siguiente:

  1. reproducir música de fondo a largo/grande en MediaPlayer.
  2. Reproduzca archivos de sonido cortos en varias instancias de SoundPool para evitar el error de montón. El código de ejemplo para Soundpools múltiples:


/** 
    * Multi SoundPool to prevent memory error. 
    */ 
public class SoundPools {

private static final String TAG = "SoundPools"; private static final int MAX_STREAMS_PER_POOL = 15; private List<SoundPoolContainer> containers; public SoundPools() { containers = Collections.synchronizedList(new ArrayList<SoundPoolContainer>()); } public void loadSound(Context context, String id, String file) { Log.d(TAG, "SouldPools load sound " + file); try { for (SoundPoolContainer container : containers) { if (container.contains(id)) { return; } } for (SoundPoolContainer container : containers) { if (!container.isFull()) { container.load(context, id, file); return; } } SoundPoolContainer container = new SoundPoolContainer(); containers.add(container); container.load(context, id, file); } catch (Exception e) { Log.w(TAG, "Load sound error", e); } } public void playSound(Context context, String id, String file) { Log.d(TAG, "SouldPools play sound " + file); try { for (SoundPoolContainer container : containers) { if (container.contains(id)) { container.play(context, id, file); return; } } for (SoundPoolContainer container : containers) { if (!container.isFull()) { container.play(context, id, file); return; } } SoundPoolContainer container = new SoundPoolContainer(); containers.add(container); container.play(context, id, file); } catch (Exception e) { Log.w(TAG, "Play sound error", e); } } public void onPause() { for (SoundPoolContainer container : containers) { container.onPause(); } } public void onResume() { for (SoundPoolContainer container : containers) { container.onResume(); } } private static class SoundPoolContainer { SoundPool soundPool; Map<String, Integer> soundMap; AtomicInteger size; public SoundPoolContainer() { this.soundPool = new SoundPool(MAX_STREAMS_PER_POOL, android.media.AudioManager.STREAM_MUSIC, 0); this.soundMap = new ConcurrentHashMap<String, Integer>(MAX_STREAMS_PER_POOL); this.size = new AtomicInteger(0); } public void load(Context context, String id, String file) { try { this.size.incrementAndGet(); soundMap.put(id, soundPool.load(context.getAssets().openFd(file), 1)); } catch (Exception e) { this.size.decrementAndGet(); Log.w(TAG, "Load sound error", e); } } public void play(Context context, String id, String file) { android.media.AudioManager audioManager = (android.media.AudioManager) context .getSystemService(Context.AUDIO_SERVICE); final int streamVolume = audioManager.getStreamVolume(android.media.AudioManager.STREAM_MUSIC); Integer soundId = soundMap.get(id); if (soundId == null) { soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { @Override public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { soundPool.play(sampleId, streamVolume, streamVolume, 1, 0, 1f); } }); try { this.size.incrementAndGet(); soundPool.load(context.getAssets().openFd(file), 1); } catch (IOException e) { this.size.decrementAndGet(); Log.w(TAG, "Load/Play sound error", e); } } else { try { soundPool.play(soundId, streamVolume, streamVolume, 1, 0, 1f); } catch (Exception e) { Log.w(TAG, "Play sound error", e); } } } public boolean contains(String id) { return soundMap.containsKey(id); } public boolean isFull() { return this.size.get() >= MAX_STREAMS_PER_POOL; } public void onPause() { try { soundPool.autoPause(); } catch (Exception e) { Log.w(TAG, "Pause SoundPool error", e); } } public void onResume() { try { soundPool.autoResume(); } catch (Exception e) { Log.w(TAG, "Resume SoundPool error", e); } } } }

Cuestiones relacionadas