2013-11-23 2 views
0

У меня есть несколько различных действий, каждый из которых с MediaPlayer и OnCompletionListener запускает другие действия после того, как текущий файл перестает играть. Там также задержка построен в OnCompletion прослушивателе, который я достичь через Handler с postDelayed и это выглядит следующим образом:Прерывать постданные из обработчика внутри OnCompletionListener

public void onCompletion(MediaPlayer mp) { 

     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Intent stopplay; 
        stopplay = new Intent(actualActivity, Class 
          .forName(nextView)); 
        actualActivity.startActivity(stopplay); 
       } catch (ClassNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }, stopTime); 


} 

Проблема с этим, когда я называю мой SettingsActivity, иногда он просто переключается на операцию это было бы следующим. Поэтому я предполагаю, что он висит в ожидании postDelayd ...

Как я мог обойти это?

Я также сделать это в OnStop, OnPause и OnDestroy этих мероприятий:

if (mPlayer != null) { 
     mPlayer.stop(); 
     mPlayer.release(); 
     mPlayer = null; 
    } 

ответ

2

Вы должны отменить обратный вызов обработчика, когда вы не хотите, чтобы это было выполнено.

Определите своего обработчика в своей области действия (потому что вам нужно его достичь). Что-то вроде этого:

public class MainActivity extends Activity { 

    Handler handler = new Handler(); 
    Runnable myRunnable; 
     ... 
} 

и определить ваш работоспособным в вашей деятельности (может быть внутри вас onCreate метод)

myRunnable = new Runnable() { 
    @Override 
    public void run() { 
     try { 
      Intent stopplay; 
      stopplay = new Intent(actualActivity, Class 
        .forName(nextView)); 
      actualActivity.startActivity(stopplay); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
}; 

Изменить код:

handler.removeCallbacks(myRunnable); 
handler.postDelayed(myRunnable, stopTime); 

И если вы хотите, чтобы отменить его попробуйте следующее:

handler.removeCallbacks(myRunnable); 
+0

Проблема заключается в том, что обработчик теперь используется внутри класса, который расширяет OnCompletionListener. это выглядит так: http://pastebin.com/fGJeSs0y – Kazoooka

+0

У вас должна быть ссылка на этот обработчик. – Devrim

+0

Вы видите, где моя проблема? Я не могу передать этот обработчик в OnCompletionListener ... – Kazoooka

Смежные вопросы