2011-09-15 23 views
6

Hata ayıkladığımda bu hatayı yüzlerce kez alıyorum, programı etkilemiyor gibi görünüyor, ama nasıl kurtulacağım? 03: 09,190:android soundpool heapsize taşma

Ben diğer mesajlar

09-15 09 geri SoundPool kadar takip dayalı olduğunu biliyoruz ERROR/AudioCache (34): Öbek boyutu taşma! req size: 1052672, en büyük beden: 1048576

+0

Sonra bunu nasıl yapacağım – RoflcoptrException

+0

sadece yığın boyutu artırmak? – GideonKain

+0

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

cevap

0

Belki de medya kaynağınız soundpool ile oynamak için çok büyük. Soundpool sadece kısa ses efektleri çalar. Soundpool API'sında, soundpool ile çalınacak bir kaynağın maksimum değeri hakkında bir özellik yoktur, ancak bunu kullanırsanız, örneğin bir atıcı oyunda kısa bir patlama gibi kısa ses efektleri oynayın. Bu sizin sorununuz ise, Seslerinizi çalmak için MediaPlayer kullanmalısınız.

10

SoundPool, tüm yüklü dosyalar için arabellek boyutunu 1M olarak sabit koddur. Bu yüzden, SoundPool'a çok fazla dosya yüklediğinizde muhtemelen 'yığın boyutu taşması' hatası alacaksınız. Ayrıca SoundPool içine oyun ses FX yükleyecektir bir oyun projesi üzerinde bu sorun ve çözüm aşağıdaki gibidir:

  1. MediaPlayer içinde uzun/geniş arkaplan müziği çal.
  2. Yığın hatasını önlemek için kısa ses dosyalarını çoklu SoundPool örneklerinde çalın. Çok SoundPools için örnek kod:


/** 
    * 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); } } } }

İlgili konular