2013-08-21 14 views
22

Chcę wielokrotnie wywoływać metodę po każdych 5 sekundach i kiedy chcę zatrzymać powtarzające się wywołanie metody, mogę zatrzymać lub ponownie uruchomić wielokrotne wywołanie metody.Jak powtórzyć zadanie po ustalonym czasie w systemie Android?

Oto przykładowy kod, który naprawdę chcę zaimplementować. Proszę, pomóż mi w tym względzie, byłbym bardzo wdzięczny.

private int m_interval = 5000; // 5 seconds by default, can be changed later 
private Handler m_handler; 

@Override 
protected void onCreate(Bundle bundle) 
{ 
    ... 
    m_handler = new Handler(); 
} 

Runnable m_statusChecker = new Runnable() 
{ 
    @Override 
    public void run() { 
      updateStatus(); //this function can change value of m_interval. 
      m_handler.postDelayed(m_statusChecker, m_interval); 
    } 
}; 

public void startRepeatingTask() 
{ 
    m_statusChecker.run(); 
} 

public void stopRepeatingTask() 
{ 
    m_handler.removeCallbacks(m_statusChecker); 
} 
+0

Spróbuj http://stackoverflow.com/a/14377875/28557 i http://mobile.tutsplus.com/tutorials/android/android-fundamentals-scheduling-recurring-tasks/ –

+0

Myślę, że jego łatwe używać CountDownTimer. Zobacz tutaj samouczek: http://androidsolution4u.blogspot.in/2012/12/android-count-down-timer.html –

Odpowiedz

57

Set powtarzane zadania przy użyciu to:

//Declare the timer 
Timer t = new Timer(); 
//Set the schedule function and rate 
t.scheduleAtFixedRate(new TimerTask() { 

    @Override 
    public void run() { 
     //Called each time when 1000 milliseconds (1 second) (the period parameter) 
    } 

}, 
//Set how long before to start calling the TimerTask (in milliseconds) 
0, 
//Set the amount of time between each execution (in milliseconds) 
1000); 

i jeśli chcesz, aby anulować zadanie po prostu zadzwonić t.cancel() tutaj t to Timer obiekt

można także sprawdzić komentarz umieszczony poniżej odpowiedź dała krótką informację na ten temat.

+0

Po pierwszej iteracji otrzymuję komunikat "Wywołany z niewłaściwego wątku" – fix

+1

Dla systemu Android uchwyt jest lepszy niż licznik czasu: https://stackoverflow.com/questions/20330355/timertask-or-handler – Suragch

4

użycie TimerTask zadzwonić po określonym przedziale czasowym

Timer timer = new Timer(); 
    timer.schedule(new UpdateTimeTask(),1, TimeInterval); 

i

class UpdateTimeTask extends TimerTask { 

     public void run() 
      {   
      // do stufff 
      } 

     } 
6

Użyj Handler w metodzie onCreate(). Jego metoda postDelayed() powoduje dodanie Runnable do kolejki komunikatów i uruchomienie po upływie określonego czasu (w danym przykładzie 0). Następnie będzie on staciał się w kolejce po ustalonym czasie (1000 milisekund w tym przykładzie).

Patrz ten kod:

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    android.os.Handler customHandler = new android.os.Handler(); 
    customHandler.postDelayed(updateTimerThread, 0); 
} 

private Runnable updateTimerThread = new Runnable() 
{ 
    public void run() 
    { 
     //write here whaterver you want to repeat 
     customHandler.postDelayed(this, 1000); 
    } 
}; 
0

zrobić to w sposób Android z pomocą Handler.

Zadeklaruj Handler, która does not leak Memory

/** 
    * Instances of static inner classes do not hold an implicit 
    * reference to their outer class. 
    */ 
    private static class NonLeakyHandler extends Handler { 
     private final WeakReference<FlashActivity> mActivity; 

     public NonLeakyHandler(FlashActivity activity) { 
      mActivity = new WeakReference<FlashActivity>(activity); 
     } 

     @Override 
     public void handleMessage(Message msg) { 
      FlashActivity activity = mActivity.get(); 
      if (activity != null) { 
       // ... 
      } 
     } 
    } 

zadeklarować runnable który obsługiwać zadania

private Runnable repeatativeTaskRunnable = new Runnable() { 
     public void run() { 
      new Handler(getMainLooper()).post(new Runnable() { 
       @Override 
       public void run() { 

     //DO YOUR THINGS 
     } 
    }; 

Inicjalizacja obsługi obiektu w swojej działalności/Fragment zadania

//Task Handler 
private Handler taskHandler = new NonLeakyHandler(FlashActivity.this); 

Powtórz po raz fix przedział

taskHandler.postDelayed (repeatateTaskRunnable, DELAY_MILLIS);

stop powtórzenie

taskHandler .removeCallbacks (repeatativeTaskRunnable);

Powiązane problemy