2011-09-12 12 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(おそらくonDestroyにある)を破壊する前にメディアプレーヤーを使用する必要があります。そうしないと、リソースが解放されずにすぐにメモリが使い果たされます。

これらのサウンドを多くのアクティビティで使用する場合は、シングルレットーンを作成し、アクティビティを切り替えるたびにそのサウンドを作成することはできません。

+0

私はSoundFXですべてのオブジェクトを解放するreleaseSoundFXメソッドを持っていて、次にonDestoryをオーバーライドし、各子アクティビティでメソッドを呼び出す必要がありますか? –

+0

分で編集を参照してください。 – MByD

+0

もう少し学ぶ必要があると思います。シングルトンを作成しようとしていたので、1つしかインスタンスがありませんでした。どこで私は間違えましたか? :(ところで - onDestoryメソッドとリリースは素晴らしい作品! –

関連する問題