2016-08-27 5 views
0

Прежде чем кто-нибудь указывает на это, я прочитал this answer about Handler, и этот вопрос строит apon.Как отменить код на Android?

Мой код выглядит следующим образом

Handler timerHandler =new Handler(); 
Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() {//stuff that is called iteratively and needs delay before every iteration 
     do some stuff; 
     if(ExitCodition){ 
      timerHandler.removeCallbacks(timerRunnable); 
     } 
     else {//call that stuff again 
      timerHandler.postDelayed(this, 500); 
     } 
    } 
}; 
someMethodCalledOnButtonClick(){ 
    //do foo; 
    timerHandler.postDelayed(timerRunnable,500); 
    //do bar; 
} 

Что мне нужно, что когда someMethodCalledOnButtonClick() называется, исполнение происходит как

  1. Foo 2.the материал, который нуждается задержки 3. бар

Я вижу, что код, требующий d elay фактически работает независимо от более позднего кода (bar), поэтому код bar выполняется, а код обработчика запускается параллельно.

Как обеспечить выполнение кода в правильном порядке? Все, что мне нужно, это добавить задержку в выполнении каждой итерации некоторого кода (без задержки, я мог бы просто использовать цикл while)

+0

Вы можете использовать msg.what, чтобы отличить различную задачу, когда ваш timerRunnable закончен, отправьте сообщение msg в обработчик для выполнения кода о «do bar». –

ответ

0

Обработчик будет выполнять свой код асинхронно, он будет работать в другом потоке. Попробуйте положить //do bar код внутри обработчика и посмотреть, если вы получите то, что вы хотите :)

Handler timerHandler =new Handler(); 
Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() {//stuff that is called iteratively and needs delay before every iteration 
     do some stuff; 
     if(ExitCodition){ 
      timerHandler.removeCallbacks(timerRunnable); 
     } 
     else {//call that stuff again 
      timerHandler.postDelayed(this, 500); 
      //do bar; // YOUR CODE HERE 
     } 
    } 
}; 
someMethodCalledOnButtonClick(){ 
    //do foo; 
    timerHandler.postDelayed(timerRunnable,500); 
} 
0

Как я могу гарантировать, что код будет выполнен в правильном порядке?

Переместить логику под названием «бар» в метод run()timerRunnable.

Если имя метода someMethodCalledOnButtonClick буквальным —, что этот метод вызывается в главном потоке приложения в ответ на нажатие кнопки — затем вы не хотите блокировать главный поток приложения в someMethodCalledOnButtonClick(). В конце концов, это предотвращает запуск timerRunnable.

0

Чтобы сделать задержку можно использовать:

SystemClock.sleep(timeInMills);

Это просто функция сна.

+2

Do ** NOT ** вызов 'sleep()' в основной теме приложения, пожалуйста. – CommonsWare