Android, получая исключение, которое вылетает из моего приложения - PullRequest
1 голос
/ 28 сентября 2011

Я учусь нубу, создавая простую игру:
Есть несколько кнопок, которые пользователь может нажать
Я показываю некоторые вопросы на экране, и он должен нажать одну из кнопок в качестве ответа
когда он нажимает кнопку, я издаю звук.
3 неправильных ответа и игра окончена.

Просто верно?
Все работает, и я многому научился, за исключением одного исключения "#% #"% "#, которое продолжает сбой моего приложения: (

Это действительно странно, вкл.3 неправильных ответа: игра окончена, поэтому я запускаю этот код:

soundPool.release();            
this.finish();

, который возвращает пользователя к последнему действию, и он может начать игру снова. Проблема возникает каждые 3-5 раз после перезапускаигра ... Я получаю силу близко, и это в logcat: http://imageshack.us/photo/my-images/90/91939698.png/

Кажется, здесь ошибка:

public void playSound(int sound) {

AudioManager mgr = (AudioManager)GameScreen.this.getSystemService(Context.AUDIO_SERVICE);
float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);    
float volume = streamVolumeCurrent / streamVolumeMax;

/** The below line is line 117 that is crashing the program */
soundPool.play(soundPoolMap.get(sound), volume, volume, 1, 0, 1f);     
}

Пожалуйста, посоветуйте, как я могу раздавить эту надоедливую "ошибка ".

Спасибо!
Райан

===============================================================================

РЕДАКТИРОВАТЬ:

в onCreate Я делаю это:

new LoadMusicInBackground().execute();

иLoadMusicInBackground это:

/** Helper class to load all the music in the background. */
class LoadMusicInBackground extends AsyncTask<Void, String, Void> 
{ 
    @Override 
    protected Void doInBackground(Void... unused) { 

        soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 100);
        soundPoolMap = new HashMap<Integer, Integer>();

            soundPoolMap.put(A1,    soundPool.load(GameScreen.this, R.raw.a,    1));                
            soundPoolMap.put(A3,    soundPool.load(GameScreen.this, R.raw.b,    1));         
            soundPoolMap.put(A5,    soundPool.load(GameScreen.this, R.raw.c_s,  1));
            soundPoolMap.put(A6,    soundPool.load(GameScreen.this, R.raw.d,    1));       
            soundPoolMap.put(A8,    soundPool.load(GameScreen.this, R.raw.e,    1)); 
            soundPoolMap.put(A10,   soundPool.load(GameScreen.this, R.raw.f_s,  1)); 
            soundPoolMap.put(A12,   soundPool.load(GameScreen.this, R.raw.g_s,  1));
            soundPoolMap.put(wrong, soundPool.load(GameScreen.this, R.raw.wrong2,   1));

            publishProgress(""); 
        Log.v("SOUNDPOOL",""+soundPoolMap);
      return(null); 
    } 

    @Override 
    protected void onProgressUpdate(String... item) 
    { 
        //text1.setText(item[0]);
    } 

    @Override 
    protected void onPostExecute(Void unused) { 
      //Toast .makeText(GameScreen.this, "Done!", Toast.LENGTH_SHORT).show(); 
    } 
  } 

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

...

РЕДАКТИРОВАТЬ:

публичный финал void release ()
Освободите ресурсы SoundPool. Освободи всю память и родную ресурсы, используемые объектом SoundPool. SoundPool больше не может быть используется, и ссылка должна быть нулевой.

Вы не можете повторно использовать объект soundPool после вызова release, поэтому вам нужно создать новый экземпляр. Поэтому сделайте это, чтобы убедиться, что оно не возобновлено:

   soundPool.release();
   soundPool = null;
0 голосов
/ 28 сентября 2011

Для noob у вас все хорошо: -D

Я думаю, что это вызывает вашу проблему:

soundPool.release();

Вы вероятно выпускаете это и пытаетесь использовать это в следующий раз. См. release () документация ....

0 голосов
/ 28 сентября 2011

Я бы попробовал зарегистрировать soundPool и soundPoolMap, так как похоже, что один из них нулевой.
Возможно, как часть перезапуска игры эти значения будут очищены?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...