2012-04-18 17 views
28

Potrzebuję wykonać kod w regularnych odstępach czasu (połączyć się z serwerem i pobierać dane z bazy danych MySQL co minutę). W tym celu mam Sync Klasa:Android: wykonywanie kodu w regularnych odstępach czasu

public class Sync { 

    static private Handler handler = new Handler(); 
    Runnable task; 

    public Sync(Runnable task, long time) { 
     this.task = task; 
     handler.removeCallbacks(task); 
     handler.postDelayed(task, time); 
    } 
} 

iw moim Aktywny mam:

public void onCreate(Bundle savedInstanceState) { 
    ... 
    Sync sync = new Sync(call,60*1000); 
    ... 
} 

final private Runnable call = new Runnable() { 
    public void run() { 
    //This is where my sync code will be, but for testing purposes I only have a Log statement 
    Log.v("test","this will run every minute"); 
    } 
}; 

Próbowałem to z krótszego okresu czasu do testowania, ale działa tylko raz. Kiedy Loguje wiadomość po raz pierwszy, jest także ostatnią. Czy ktoś widzi, co tu robię? Dzięki!

+0

scheduleWithFixedDelay z ScheduledThreadPoolExecutor jest jeszcze jedna opcja. –

Odpowiedz

48

Możesz to zrobić, korzystając z poniższego kodu, Mam nadzieję, że pomoże!

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 

    @Override 
    public void run() { 
     try{ 
      //do your code here 
     } 
     catch (Exception e) { 
      // TODO: handle exception 
     } 
     finally{ 
      //also call the same runnable to call it at regular interval 
      handler.postDelayed(this, 1000); 
     } 
    } 
}; 
+2

Tak, właśnie to zamierzałem powiedzieć. AlarmManager jest cięższy i wymaga obsługi Intents, aby uruchomić Runnable. Posiadanie swojego Runnable ponownie na końcu, jeśli chcesz iść. I powinieneś zawinąć swój kod w Runnable za pomocą try-finally i ponownie opublikować Runnable w sekcji finally, aby upewnić się, że nigdy nie zostanie pominięty. – Greg

+1

To rozwiązało, dziękuję! :) –

+27

Myślę, że 'handler.postDelayed (this, 1000);' powinien znajdować się tylko w sekcji finally (nie na końcu bloku try), w przeciwnym razie będzie publikowany dwa razy. – Parmaia

2

handler.postDelayed(task, time); będzie wykonać tylko raz, jeśli chcesz kod do uruchomienia w regularnych odstępach czasu chciałbym zaproponować Timer i TimerTask zamiast Handler i Runnable.

TimerTasks można ustawić tak, aby był uruchamiany raz, co x sekund lub z określonym czasem, np. x sekunda - jakkolwiek trwało to do ostatniego uruchomienia.

8

Najpierw musisz zadeklarować obsługę globalnie Po drugie, musisz ponownie użyć metody opóźnienia postu, aby uruchomić ją ponownie.

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Sync sync = new Sync(call,60*1000); 

    } 
    final private Runnable call = new Runnable() { 
     public void run() { 
     //This is where my sync code will be, but for testing purposes I only have a Log statement 
     Log.v("test","this will run every minute"); 
     handler.postDelayed(call,60*1000); 
     } 
    }; 
    public final Handler handler = new Handler(); 
    public class Sync { 


     Runnable task; 

     public Sync(Runnable task, long time) { 
      this.task = task; 
      handler.removeCallbacks(task); 
      handler.postDelayed(task, time); 
     } 
    } 


} 
1
 private void doSomethingRepeatedly() { 
     timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 

        try{ 

        //Your code 

        } 
        catch (Exception e) { 
         // TODO: handle exception 
        } 

      } 
      }, 0, 10000); 
        } 
0

Alternatywnym sposobem, za pomocą ScheduledExecutorService na scheduleAtFixedRate:

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

public void beepEvery10Seconds() { 
    final Runnable beeper = new Runnable() { 
     public void run() { System.out.println("beep"); } 
    }; 
    final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 0, 10, SECONDS); 
} 
Powiązane problemy