2013-12-26 2 views
1

Я хочу выполнить какой-то код каждую секунду в android, но я хотел бы сделать это в одной теме (основной поток). До сих пор у меня есть это:Выполнять метод каждую секунду

locationTimer = new Timer("locationTimer", false); 
locationTimer.schedule(new LocationCheckerTask(this), 0, 1000); 

public class LocationCheckerTask extends TimerTask { 
    private GeoWatcher watcher; 

    public LocationCheckerTask(Context context) { 
     watcher = new GeoWatcher(context); 
    } 

    @Override 
    public void run() { 
     // funky stuff 
    } 
} 

К сожалению, Timer класс работает это задачи в другом потоке. Почему я хочу сделать это в одном потоке? Код в run() метод будет выполняться очень быстро, поэтому я решил, что для этого не нужен другой поток. То, что я хочу сделать, - это построить отдельные потоки в методе run() на основе условия, рассчитанного каждую секунду. Поэтому вместо того, чтобы иметь дочерний поток, создающий другие потоки, я хотел бы сделать это на главном.

+0

Вы используете этот код в Управлении? –

+0

Да, инициализация 'locationTimer' выполняется в' Activity' –

+0

Тот факт, что метод run будет выполняться быстро, не является причиной того, что он не запускает его в отдельном потоке. Если вы хотите запустить его в основном потоке, вам понадобится способ подождать секунду, которая заблокирует ваш основной поток .... – assylias

ответ

3

Вы можете сделать это с помощью Handler

public class Job implements Runnable{ 
    private Handler handler; 

    public Job() { 
     handler = new Handler(Looper.getMainLooper()); 
     loop(); 
    } 

    @Override 
    public void run() { 
     // funky stuff 
     loop(); 
    } 

    private void loop() { 
     handler.postDelayed(this, 1000); 
    } 
} 
+0

Будет ли этот код блокировать мой основной поток в течение одной секунды (нежелательное поведение)? –

+1

@ MarekMałek No. Основной поток будет заблокирован только во время выполнения 'run()'. Поэтому любой тяжелый подъем в 'run()' должен выполняться в отдельном потоке. – Ole

+0

Хорошо, спасибо, спасибо! –

0
private Runnable fiveSecondRunnable = new Runnable() { 

    @Override 
    public void run() { 
     if (count5 < 0) { 
      switchT030Sec(); 
     } else { 
      tvSec5.setText(""+count5); 
      Log.v("5sec set", "yes"); 
      count5--; 
      man.postDelayed(this, 1000); 
     } 

    } 
}; 

и запустить его по телефону

man.post(fiveSecondRunnable); 
1

Используйте runOnUiThread(Runnable) метод деятельности для выполнения задачи в UI Thread

public class LocationCheckerTask extends TimerTask { 
    private GeoWatcher watcher; 

    public LocationCheckerTask(Context context) { 
     watcher = new GeoWatcher(context); 
    } 

    @Override 
    public void run() { 
     runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       // funky stuff 
      } 
     }); 
    } 
} 
1

Обработчик является идеальным кандидатом для таких задач (DonT попробовать для объединения TimerTask + runOnUiThread - бесполезно, поскольку он использует обработчик под капотом)

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