2016-10-03 2 views
0

Один из моих классов имеет два обработчика для отправки сообщений через регулярный промежуток времени. Этот класс создается в одном из действий. Ниже приведен код:Обработчик runnable работает несколько раз

public class MyClass { 

    private Boolean started = false; 
    private Handler handler1 = new Handler(); 
    private Handler handler2 = new Handler(); 
    private Runnable runnable1 = new Runnable() { 
      @Override 
      public void run() { 
       sendMessage("blah"); 
      } 
     }; 
    private Runnable runnable2 = new Runnable() { 
      @Override 
      public void run() { 
       sendMessage("blah blah"); 
       if (started) { 
        triggerMessageSending(); 
       } 
      } 
     }; 
    } 

    public void startMessageSending(){ 
     triggerMessageSending(); 

    } 

    private void triggerMessageSending(){ 
     started = true; 
     handler1.postDelayed(runnable1, 500); 
     handler2.postDelayed(runnable2, 1000); 
    } 

    public void stopMessageSending(){ 
     started = false; 
     handler1.removeCallbacks(runnable1); 
     handler2.removeCallbacks(runnable2); 
    } 

} 

Вот моя активность:

public class MyActivity extends Activity { 

private MyClass myClass; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     myClass = new MyClass(); 
     myClass.startMessageSending(); 

} 

@Override 
    protected void onStop() { 
     super.onStop(); 
     myClass.stopMessageSending(); 
} 
} 

Все отлично работает в первый раз. Если я нажмю кнопку «Назад» и перейду к предыдущему действию и вернусь снова (без выхода из приложения), метод sendMessage вызывается дважды. Это будет три, если я сделаю это снова. Он вызывает метод столько раз, сколько я начинаю эту деятельность, не выходя из приложения. Если я выйду из приложения и сделаю это снова, он будет работать нормально в первый раз.

В чем причина этого? Где я ошибаюсь?

+0

Я не уверен, но попробую установить 'myClass = null;' в 'onStop()' метод. –

+0

Пробовал это .. не работает – NewOne

+0

Попробуйте объект 'static' myClass. –

ответ

0

Не уверен в вашей бизнес-логике, но это те проблемы, которые я вижу в вашем коде.

  • Если как Runnable делают ту же работу (sendMessage), что является точкой наличием двух runnables?
  • Во втором Runnable runnable2, опять то же сделано. Разница только проверка boolean started который вызывает triggerMessageSending() происходит за цикл

Теперь MyClass инициация объекта делается в onCreate с triggerMessageSending() методом, который инициирует два обработчика, а затем runnables

ПРИМЕЧАНИЕ: onStop() может или не вызываются во время жизненного цикла активности. Проверьте это link. I означает, что он не гарантируется. Проделайте myClass.stopMessageSending(); в onPause() и проверить

Так ваше сообщение вызывается дважды.

+0

Я хочу отправить сообщение A и сообщение B в качестве альтернативы каждые 500 мс. Как я могу сделать это в 1 runnable? – NewOne

+0

Просто используйте логическую переменную и измените ее после отправки сообщения. if (true) sendOne else sendSecond. Переменная должна быть глобальной, а не локальной для обработчика. Опять же, если вызывается обработчик, проверяется одна и та же глобальная переменная, и сообщение будет отправлено. – Stallion

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