2013-03-05 2 views
4

У меня есть серия обработчиков postDelayed. У меня возникли проблемы с установкой mathode, который останавливает обработчики, когда пользователь нажимает кнопку остановки в любое время, когда захочет.Как остановить серию обработчиков postDelayed

Буду признателен за любую помощь, которую кто-то может предоставить. Благодаря

while (!lessonIsRunning) { 
     Handler handler0 = new Handler(); 
     handler0.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       plate1.setVisibility(ImageView.VISIBLE); 
       plate2.setVisibility(ImageView.VISIBLE); 
       plate3.setVisibility(ImageView.VISIBLE); 
      } 
     }, 6000); 

     Handler handler1 = new Handler(); 
     handler1.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       apples1.setVisibility(ImageView.VISIBLE); 
      } 
     }, 9000); 

     Handler handler2 = new Handler(); 
     handler2.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       plus1.setVisibility(TextView.VISIBLE); 
      } 
     }, 9250); 
} 
public void stopLesson(View V){ 

} 
+2

Почему вы используете несколько обработчиков? Почему не один обработчик? – CommonsWare

ответ

12

вместо написания Runnable задачи анонимно вы должны определить его с именем, так что позже вы будете иметь ссылку на него, чтобы удалить:

//there is no need for multiple handlers 
//handler must be declared outside all functions, in order for you to use it everywhere. 

Handler handler = new Handler(); 
Runnable myFirstTask = new Runnable(){ 
     @Override 
       public void run() { 
        plate1.setVisibility(ImageView.VISIBLE); 
        plate2.setVisibility(ImageView.VISIBLE); 
        plate3.setVisibility(ImageView.VISIBLE); 
       } }; 

    Runnable mySecondTask = new Runnable(){ 
     @Override 
       public void run() { 
        plus1.setVisibility(TextView.VISIBLE); 
       } 

    }; 

    Runnable myThirdTask = new Runnable(){ 
     @Override 
       public void run() { 
        apples1.setVisibility(ImageView.VISIBLE); 
       } } 

    //you can put different tasks on the same handler object 

    while (!lessonIsRunning) { 
      handler.postDelayed(myFirstTask,6000); 
      handler.postDelayed(mySecondTask,9250); 
      handler.postDelayed(myThirdTask,9000); 
} 
public void stopLesson(View V){ 
    //notice that you don't need these, because the handlers are not recursive 
    //you don't have lines "handler.postDelayed(sameTask,someTime);" 
    //in your run Method of the runnable 
if(handler!=null){ 
    handler.removeCallbacks(myFirstTask); 
    handler.removeCallbacks(mySecondTask); 
    handler.removeCallbacks(myThirdTask); 
    //if this method is inside onPause or onDestroy add this line as well: 
    handler=null; 

} 
} 
+0

Вы пробовали метод removeCallbacksAndMessages (null), вместо этого три строки removeCallback (runnable)? Я в порядке с этим, я прошу только знать, работает ли это, как говорит документация. –

+0

Могут быть другие обратные вызовы, которые вы не хотите удалять –

+0

Я знаю, но в этом конкретном случае? Работает? Потому что у @RBZ есть проблема. –

4

вы можете дать

handler0.removeCallbacksAndMessages(null); 
handler1.removeCallbacksAndMessages(null); 
handler2.removeCallbacksAndMessages(null); 

попробовать. Документ говорит, что когда вы отправляете нулевой токен, все обратные вызовы и сообщение удаляются.

+0

Спасибо за быстрый ответ! проблема в том, что я получаю nullPointerException на handler1.removeCallbacksAndMessages (null); когда я останавливаю его, когда обработчик0 играет. существует ли метод проверки состояния обработчика? или любое логическое условие, о котором вы можете думать? – RBZ

+0

проблема не связана с аргументом removeCallbacksAndMessages. Вероятно, обработчик1 является нулевым. – Blackbelt

+1

@RBZ: Также вызывайте эти методы только из основного потока обработчика (например, основного потока приложения). – CommonsWare

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