0

Я разрабатываю приложение, в котором я отправляю местоположение устройства на сервер за каждый мин. Я использую Handler здесь, чтобы запланировать свою задачу. После нажатия на кнопку STOP обработчик должен прекратить выполнение. Я не могу этого добиться. Пожалуйста, найдите мой код ниже.Как остановить обработчик, который работает на интервале (1 мин)?

public void callSpecficTime() { 

    timer = new Timer(); 
    doAsynchronousTask = new TimerTask() { 
     @Override 
     public void run() { 

      handler.post(new Runnable() { 
       public void run() { 
        try { 
         Log.e("TImeOnSchedule", String.valueOf(inTime)); 
         if(inTime==5) 
         { 
          new PostDataAsyncTask().execute(); 
         } 


        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(doAsynchronousTask, 0, 60000); 
} 

StopTask код:

public void stopTask(){ 

    if(doAsynchronousTask!=null){ 
     Log.d("TIMER", "timer canceled"); 
     handler.removeCallbacks(doAsynchronousTask); 
    // timer.cancel(); 
     doAsynchronousTask.cancel(); 
    } 

} 

Я попытался stopService, removeCallbacks, но это не сработало. Может ли кто-нибудь предоставить мне решение для этого?

ОБНОВЛЕНО

public void onClickButton(View v) 
{ 
    if(v.getId()==R.id.IBstart) 
    { 
     callAsynchronousTask(); 
     callSpecficTime(); 
    } 
    else if(v.getId()==R.idIBstop) 
    { 
     stopTask(); 
    } 
} 

Это ** callAsynchronousTask() **

public void callAsynchronousTask() { 
    new PostDataAsyncTask().execute(); 
} 

Я отправляю данные дважды. Первый раз, когда пользователь нажимает кнопку START, а затем я запускаю таймер для выполнения на каждый мин.

ответ

0

использование purge() после cancel();

public void stopTask(){ 

    if(doAsynchronousTask!=null){ 
     Log.d("TIMER", "timer canceled"); 
     handler.removeCallbacks(doAsynchronousTask); 
    // timer.cancel(); 
     doAsynchronousTask.cancel(); 
     doAsynchronousTask.purge(); 
    } 

} 
+0

время.purge() справа? Я это сделал. Все еще проблема такая же. Я получаю 'doAsynchronoursTask' как' null' –

0
  1. Вы должны остановить TimerTask сначала: Timer.Cancel() и Timer.Purge().
  2. вы можете изменить: handler.removeCallbacks(doAsynchronousTask); до removeCallbacksAndMessages(null).

Edit:

Посмотрите на свой график код: timer.schedule(doAsynchronousTask, 0, 60000); -> это означает, что вы начинаете свой task сразу и повторил это после 60-х годов.
Когда я вижу вашего слушателя onClickButton, есть две задачи, которые будут выполнены немедленно. В результате вы не можете отменить выполняемые задачи. Чтобы этого избежать, вы можете позвонить: timer.schedule(doAsynchronousTask, 60000, 60000);

+0

Я пытался ... И все это работает ... 'общественная пустота stopTask() { timer.cancel(); timer.purge(); // new PostDataAsyncTask(). Cancel (true); handler.removeCallbacksAndMessages (null); } ' –

+0

Где вы звоните callSpecficTime()? –

+0

Когда пользователь нажимает кнопку ** START ** в UI –