2011-09-12 7 views
0

다음은 오류입니다 :MediaPlayer가 실패하는 이유는 무엇입니까?

내가 (다른 모든 활동은 모두 공유 음향 효과 및 하위 메뉴 그래서 base-- 확장)를 기본 활동 안에 SoundFX 객체를 인스턴스화 is-- 뭐하는 거지
09-12 22:13:05.253: ERROR/AudioFlinger(561): not enough memory for AudioTrack size=53560 
09-12 22:13:05.253: ERROR/AudioTrack(561): AudioFlinger could not create track, status: -12 
09-12 22:13:05.253: ERROR/AudioSink(561): Unable to create audio track 
09-12 22:13:05.253: ERROR/audiothread(561): Error creating AudioTrack 
09-12 22:13:05.253: ERROR/PlayerDriver(561): Command PLAYER_PREPARE completed with an error or info PVMFFailure 
09-12 22:13:05.253: ERROR/MediaPlayer(2368): error (1, -1) 

.

여기 내 SoundFX 클래스의 :

public class SoundFX { 
private SharedPreferences prefs = null; 
private MediaPlayer[] sounds = null; 

SoundFX(Context c){ 
    ValidateObject.isNotNull(c, "Null context."); 

    prefs = PreferenceManager.getDefaultSharedPreferences(c); 
    ValidateObject.isNotNull(prefs, "Null preferences."); 

    sounds = new MediaPlayer[4]; 
    sounds[0] = MediaPlayer.create(c, R.raw.snd_button_menu); 
    sounds[1] = MediaPlayer.create(c, R.raw.snd_button_direction); 
    sounds[2] = MediaPlayer.create(c, R.raw.snd_button_text); 
    sounds[3] = MediaPlayer.create(c, R.raw.snd_button_drill); 
} 

public void menu(){ 
    if (prefs.getBoolean("SoundFX", true)){ 
     sounds[0].start(); 
    } 
} 

public void direction(){ 
    if (prefs.getBoolean("SoundFX", true)){ 
     sounds[1].start(); 
    } 
} 

public void text(){ 
    if (prefs.getBoolean("SoundFX", true)){ 
     sounds[2].start(); 
    } 
} 
public void drill(){ 
    if (prefs.getBoolean("SoundFX", true)){ 
     sounds[3].start(); 
    } 
} 
} 

이 모든 활동이 확장 내 "기본"활동이 될 것입니다 :

public class ActivityWithMenu extends Activity { 
protected SoundFX soundEffects = null; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    // no content view... 
    soundEffects = new SoundFX(this); 
    ValidateObject.isNotNull(soundEffects, "Null SoundFX Object."); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.submenu, menu); 
    return true; 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.submenu_hide: 
     moveTaskToBack(true); 
     return true; 
    case R.id.submenu_help: 
     startActivity(new Intent(this, HelpActivity.class)); 
     return true; 
    case R.id.submenu_preferences: 
     startActivity(new Intent(this, Preferences.class)); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

} 

각 활동이 더 많은 메모리를 할당하여 새로운 인스턴스를 생성하고인가를? 나는 왜 내가 추리 할 수 ​​없는지 알아낼 수 없다. 나는 ... 모든 자식 활동 이 같은 SoundFX 객체를 사용하는 것이 인상했다

편집 :

작성하고 약 10 ~ 12 활동을 파괴 한 후 오류가 제공됩니다. 그 전에는 잘 작동합니다.

+0

Hehe, mr. Google, 자신의 코드를 알아야합니다. –

답변

2

클래스를 파괴하기 전에 (아마도 onDestroy의 활동에서) 미디어 플레이어가 필요합니다. 그렇지 않으면 리소스가 해제되지 않고 곧 다시 꺼집니다.

많은 활동에서 이러한 소리를 사용하는 경우 singletone을 만들 수 있으며 활동을 전환 할 때마다이를 생성하지 않아도됩니다.

+0

그래서 모든 객체를 해제하는 SoundFX에서 releaseSoundFX 메서드를 가져와 onDestory를 재정의하고 각 자식 작업에서 메서드를 호출해야합니까? –

+0

잠시 후 편집하십시오. – MByD

+0

나는 조금 더 배울 필요가 있다고 생각한다. 나는 싱글 톤을 만들려고 했으므로 하나의 인스턴스 만 갖고 있었다. 나는 어디로 잘못 갔는가? :(그런데 - onDestory 메서드와 릴리스는 훌륭하게 작동합니다! –

관련 문제