2013-08-12 6 views
1

В моем приложении у меня есть кнопка, которая запускает AsyncTask, которая загружает данные с координатами для карт Google, а затем рисует маркер на карте в следующих координатах. Я хочу запускать его каждые 10 секунд, пока пользователь снова не нажмет кнопку.Запуск AsyncTask каждые 10 секунд до отмены

Вот мой код для обработчика:

class handleMap{ 
    Handler mHandler = new Handler(); 

    Runnable mTask = new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while(btnRefreshPressed == false){ 

       try{ 
        new getGoogleMap().execute(); 
        mHandler.postDelayed(mTask, INTERVAL); 
        Thread.sleep(INTERVAL); 
       } catch(Exception e){ 
        System.out.println(e.toString()); 
       } 
      } 
     } 
    }; 

    public void starReapetingClass(){ 
     hMap.starReapetingClass(); 
    } 
    public void stopDoing(){ 
     mHandler.stopDoing(); 
    } 
} 

И в кнопку MENU, где она называется:

case R.id.id_Refresh: 
     handleMap hMap = new handleMap(); 
     if(btnRefreshPressed == true){ 
      menuItem = item; 
      menuItem.setActionView(R.layout.progressbar); 
      menuItem.expandActionView(); 


      fRun += 1; 
      btnRefreshPressed = false; 
      hMap.run(); 
     }else if(btnRefreshPressed == false){ 
      if(fRun > 0){ 
       menuItem.collapseActionView(); 
       menuItem.setActionView(null); 
      } 
      btnRefreshPressed = true; 
      hMap.stopHandler(); 
     } 

Это в настоящее время вызывает к зависанию приложения, и система выдает диалог о том, что приложение не отвечает и спрашивает, хочу ли я закрыть или подождать.

Я подозреваю, что это связано с оператором while, но я не получаю никаких ошибок в logcat. Спасибо заранее.

ответ

2

Просто используйте:

private int mSampleDurationTime = 10000; 
private boolean continueToRun = true; 

mHandler.postDelayed(mRunnable, mSampleDurationTime); 

где mRunnable ваша задача:

private final Runnable mRunnable = new Runnable() { 

//... 
public void run() { 

    ... 

    if(continueToRun == true){ 
    mHandler.postDelayed(mRunnable, mSampleDurationTime); 
    } 

} 
    ... 
}; 

Первый раз, когда вы звоните postDelayed и вызывать new Runnable(). После этого, если вы хотите продолжить, вызовите тот же метод в run()

+0

Эй, спасибо за ваш ответ. Где я должен вставить это? –

+0

Допустим, у вас есть кнопка, которая запускает все вещи, поэтому поместите ее в 'onButtonClick()' –

+0

. Я обновил свой вопрос, как я попытался реализовать ваш ответ, и он работает, я вижу, как я получаю данные, но приложение все еще зависает. –

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