2016-02-29 2 views
0

Итак, я хочу, чтобы задача выполнялась и продолжала работать после некоторого интервала времени (например, функция JS 'setInterval() и имеет метод под названием scheduleAtFixedRate, который в основном делает то же самое . Однако, нет никакого явного механизма pause или resumeTimerTask.Пауза/возобновление сценария для TimerTask не работает

Я читал на SO, что когда-Timer отменяется, она идет в ад.

Я также читал, что обходной путь может быть достигнут.

Это мой код:

Timer t = new Timer(); 
     t1 = new TimerTask() { 
      @Override 
      public void run() { 

       //Do Something like, 
a++; 

      } 
     }; 
     t.scheduleAtFixedRate(t1, 0L, 300L); /*Pretty basic till this line. Just a TimerTask ddeclaration and execution via a Timer `t`.*/ 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if (flag == 1) { 

t.scheduleAtFixedRate(t1,0,300);//This call says "TimerTask already scheduled," even though purge removed it. 
       } else { 
        t1.cancel(); //cancelling the task so that purge does something. 
        int a = t.purge();//a is 1. Purge worked. TimerTask was removed from the queue. 
        Log.d("The number of tasks",a+"");//1 
        flag = 1; 
       } 
      } 
     }); 

Как это сделать?

Если, однако, ScheduleExecutorService может быть использован, сможет ли кто-нибудь реализовать то, что упоминается в этом комментарии? Pause/Resume ScheduleExecutorService

+0

Выполняется ли ваша задача только между 'onResume()' и 'onPause()', пока ваше приложение видимо и используется? Есть ли причина, по которой он должен работать в фоновом потоке? Запрашивать, потому что вы, возможно, захотите рассмотреть использование «Handler», поскольку использование «Таймера» обычно обескураживается. –

+0

Предположим, что задача запущена. Затем, если вызывается onPause, задача должна приостанавливаться. И удерживайте свою позицию, пока остальная часть приложения остается пригодной для использования. И когда вызывается onResume, он должен продолжать то, что он делает. Как я могу использовать Handler для этого? –

+0

Он ДОЛЖЕН работать на фоне потока. –

ответ

1

Лучший подход, чем при использовании Timer с TimerTask в этом примере будет использовать Handler в потоке пользовательского интерфейса и Handler.postDelayed(...) для планирования обратного вызова.

Вы не выполняете какую-либо тяжелую обработку или что-либо еще, что потребовало бы, чтобы обратный вызов выполнялся в отдельном потоке и обновлял элемент UI, который в любом случае должен выполняться в потоке пользовательского интерфейса.

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