2016-10-02 6 views
2

Здравствуйте, я прямо сейчас делаю бесплатный курс Udacity для создания приложения для перевода. И была задача, чтобы ListItem из ArrayList воспроизводил звук onClick. Они сказали, что вы можете сделать это самостоятельно или с учебниками. Поэтому я сделал это самостоятельно и пропустил учебники, которые показали, как это сделать. Теперь я вернулся к учебникам с моим рабочим кодом. И чем они дали нам еще одну задачу. Чтобы освободить ресурсы с помощью метода OnStop и после того, как MediaPlayer перестает играть. Но я выполнил предыдущую задачу не так, как в учебнике. И теперь я застреваю, чтобы выполнить новую задачу.Как мне изменить My OnClickListener, чтобы остановить currentSound и запустить новый One OnClick

Я создал собственный адаптер «WordAdapter», и у меня есть 4 активности.

В WordAdapter я сделал 2 глобальных значения:

частного MediaPlayer игры; private int isPlaying;

В @OverrideMethod Я установил значение isPlaying равным 0;

isPlaying = 0; 

и я создал OnClicklistener

private MediaPlayer.OnCompletionListener mOnCompletion = new MediaPlayer.OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mp) { 
     isPlaying = 0; 
     releaseMediaPlayer(); 
    } 
}; 

И я создал ширина ImageButton в OnClickListener

ImageButton playIcon = (ImageButton) listItemView.findViewById(R.id.playIcon); 
     int colorOfThePlayIcon = ContextCompat.getColor(getContext(), mColorResourceId); 
     playIcon.setBackgroundColor(colorOfThePlayIcon); 
     playIcon.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       play = MediaPlayer.create(getContext(), currentWord.getPlaySound()); 

       if (isPlaying == 1) { 
        play.stop(); 
        play.reset(); 
        play.create(getContext(), currentWord.getPlaySound()); 
        play.start(); 
        isPlaying = 1; 

       } 

       if (isPlaying == 0) { 
        play.start(); 
        isPlaying = 1; 
       } 
       play.setOnCompletionListener(mOnCompletion); 
      } 
     }); 

, чем я сделал releaseMediaPlayerMethod:

public void releaseMediaPlayer() { 
    if (play != null){ 
     play.release(); 
     play = null; 
    } 
} 

чем в Акти Vity Я сделал метод OnStop:

@Override 
protected void onStop() { 
    super.onStop(); 
    WordAdapter stopSoundAndReleasIt = new WordAdapter(this); 
    stopSoundAndReleasIt.releaseMediaPlayer(); 
} 

Так что этот код должен освободить ресурсы от MediaPlayer после слова закончил играть. И когда действие прекращается после того, как пользователь покинул приложение, ресурсы также должны быть выпущены. И когда я нажимаю на playIcon, пока MediaPlayer воспроизводит звук, он должен остановить текущий звук и начать воспроизведение нового выбранного. И если я покидаю приложение, когда MediaPlayer воспроизводит звук, он должен сначала остановить звук, а затем освободить ресурсы.

Но если я нажму на playIcon, приложение не остановит текущий звук и не запустит новый. Его просто играли оба звука. Или три звука, если я нажму три раза.

И если я покину приложение, он также не остановит текущий звук.

Так что же мне нужно изменить, чтобы остановить текущий звук onClick?

+0

Я думаю, что вы должны создавать медиаплеер вне метода 'onClick (...)'. Как и сейчас, вы всегда вызываете 'stop()' и 'release()' во вновь созданном экземпляре 'MediaPlayer' – Titus

+0

Спасибо за ваш ответ. Но если я беру '.create' из метода' onClick (...) ', приложение перестает работать, когда я нажимаю на playIcon. И я думаю, что если звук не воспроизводится, метод 'stop()' не вызывается, потому что. Значение isPlaying устанавливается равным 0 при создании приложения и методом onCompletion. –

ответ

0

Я изменил код в методе onClick и в методе releaseMediaPlayer. Теперь звук воспроизведения прекращается, и новый звук начинается, если я дважды щелкнул значок воспроизведения.

public void releaseMediaPlayer() { 
    // If the media player is not null, then it may be currently playing a sound. 
    if (play != null) { 
     // Regardless of the current state of the media player, release its resources 
     // because we no longer need it. 
     play.release(); 
     // Set the media player back to null. For our code, we've decided that 
     // setting the media player to null is an easy way to tell that the media player 
     // is not configured to play an audio file at the moment. 
     play = null; 
     Log.e("WordAdapter.this", "onStop"); 
    } 
} 

playIcon.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      releaseMediaPlayer(); 
      play = MediaPlayer.create(getContext(), currentWord.getPlaySound()); 
      play.start(); 
      play.setOnCompletionListener(mOnCompletion); 
     } 
    }); 

Теперь единственная проблема в том, что это не распространяется вызывает метод «releaseMediaPlayer (...)», если я нажимаю кнопку домой. И фактический звук не перестает играть.

В WordAdapter у меня есть этот код.Я могу вызвать метод releaseMediaPlayer в Activity.

public WordAdapter(Context context) { 
    super(context, 0, 0); 
} 

EDIT: Я получил реальную проблему теперь метод releaseMediaPlayer называется, как это должно быть, но

if(play != null) {} 

всегда находится ложь, когда я называю его от деятельности. Но я не знаю, почему.