Utilizo este SoundManager estándar. Funciona bien en todos mis dispositivos en el mercado, pero sólo de vez en cuando me siento estos erroresNullPointerException ocasional en SoundManager
NullPointerException en SoundManager.playSound (SoundManager.java:87)
NullPointerException en SoundManager.cleanup (SoundManager .java: 107)
Aquí está el código:
public class SoundManager {
private static SoundManager _instance;
private static SoundPool mSoundPool;
private static HashMap<Integer, Integer> mSoundPoolMap;
private static AudioManager mAudioManager;
private static Context mContext;
private SoundManager(){ }
static synchronized public SoundManager getInstance(){
if (_instance == null)
_instance = new SoundManager();
return _instance;
}
public static void initSounds(Context theContext){
mContext = theContext;
mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
mSoundPoolMap = new HashMap<Integer, Integer>();
mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
}
public static void addSound(int Index,int SoundID){
mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1));
}
public static void loadSounds(){
mSoundPoolMap.put(1, mSoundPool.load(mContext, R.raw.kick1, 1));
mSoundPoolMap.put(2, mSoundPool.load(mContext, R.raw.kick2, 1));
mSoundPoolMap.put(3, mSoundPool.load(mContext, R.raw.kick3, 1));
}
public static void playSound(int index, float volume){
**line 87:** float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume/mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume*volume, streamVolume*volume, 1, 0, 1);
}
public static void stopSound(int index){
mSoundPool.stop(mSoundPoolMap.get(index));
}
public static void cleanup(){
**line 107:** mSoundPool.release();
mSoundPool = null;
mSoundPoolMap.clear();
mAudioManager.unloadSoundEffects();
_instance = null;
}
}
Este es un llamado para la limpieza que está en la actividad de inicio:
//REMOVE SOUND MEMORY ALLOCATION
@Override
public void onDestroy()
{
super.onDestroy();
SoundManager.cleanup();
}
¿Alguien sabe qué podría estar causando estos errores raros ocasionales y cómo prevenirlos? Esto sucede en todas mis aplicaciones que usan este SoundManager ... Incluso un poco de especulación podría ayudar.
Si puede reproducir los errores, 'Registre 'los valores de' mSoundPool', 'mSoundPoolMap', y' mAudioManager' en los métodos 'playSound' y' cleanup'. Uno de ellos será nulo. Sin embargo, supongo que es en alguna circunstancia donde se llama algo antes de 'initSounds'. – Eric
Gracias Eric. No puedo reproducir el error, nunca en mis dispositivos, de lo contrario sería mucho más fácil encontrar la causa. – Lumis
¿podría marcar las líneas 87 y 107? – WarrenFaith