2014-12-20 1 views
0

Я пытаюсь создать простое приложение, которое содержит десять видов деятельности. Каждое действие выглядит примерно так же, оно имеет четыре кнопки (разные цвета), и когда одна конкретная кнопка нажата, она открыта в следующем направлении. Метод OnCreate для каждого вида деятельности имеет медиаплеер, который воспроизводит имя этого вида деятельности. Через некоторое время я вижу в LogCat, что gc освободил некоторые объекты, и в то время активность не воспроизводит звук, а кнопки отключены.gc освободил объекты xxxx, а затем заморозил приложение

Есть ли у вас какие-либо советы или рекомендации по их устранению?

Вот код одной деятельности:

public class Green extends Activity { 

int buttonActive = 0; 
int buttonWrong = 0; 
MediaPlayer player; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_green); 

    buttonWrong = 0; 
    playSound(); 

    Button btn = (Button)findViewById(R.id.button1); 
    Button btn2 = (Button)findViewById(R.id.button2); 
    Button btn3 = (Button)findViewById(R.id.button3); 
    Button btn4 = (Button)findViewById(R.id.button4); 

    btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      if(buttonActive == 1){ 

      playSoundCorrect(); 
      Intent intent = new Intent(v.getContext(),Blue.class); 
      startActivity(intent); 
      } 
     } 
    }); 

    btn2.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if(buttonActive == 1 && buttonWrong == 0){ 
       buttonWrong = 1; 
       playSoundWrong(); 
      }   
     } 
    }); 

btn3.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if(buttonActive == 1 && buttonWrong == 0){ 
       buttonWrong = 1; 
       playSoundWrong(); 
      }   
     } 
    }); 

btn4.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     if(buttonActive == 1 && buttonWrong == 0){ 
      buttonWrong = 1; 

      playSoundWrong(); 
     }  
    } 
}); 

} 

@Override 
protected void onPause() { 
// TODO Auto-generated method stub 
super.onPause(); 
finish(); 
} 


private void playSound(){ 

    MediaPlayer player = MediaPlayer.create(this, R.raw.green); 
    player.start(); 
    player.setOnCompletionListener(new OnCompletionListener() { 

     @Override 
     public void onCompletion(MediaPlayer mp) { 
      mp.release(); 
      buttonActive = 1; 
     } 
    }); 
} 

private void playSoundWrong(){ 

player = MediaPlayer.create(this, R.raw.wrong2); 

if(!player.isPlaying()){ 
    player.start(); 

} 

player.setOnCompletionListener(new OnCompletionListener() { 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     mp.release(); 
     buttonWrong = 0; 
    } 
}); 

} 

private void playSoundCorrect(){ 

MediaPlayer player = MediaPlayer.create(this, R.raw.correct); 
player.start(); 
player.setOnCompletionListener(new OnCompletionListener() { 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     mp.release(); 
    } 
}); 
} 
} 

ответ

0

Похоже, в private void playSound вы маскирование player свойства класса. Если вы скажете player = MediaPlayer.create, тогда свойство класса player будет установлено на новый MediaPlayer, и игрок будет доступен, пока класс доступен. Вместо этого вы говорите, что MediaPlayer player = MediaPlayer.create, который создает новую переменную player, которая привязана к методу playSound - как только метод завершает работу player, он больше не доступен и будет собираться с мусором, даже если класс по-прежнему доступен.

+0

Спасибо, это было очень полезно :) –