2012-07-24 3 views
11

Zunächst einmal konnte ich nicht einmal die Methode zu verwenden, ich lese seit Stunden jetzt und jemand sagt, verwenden Sie "Handler", jemand sagt, verwenden Sie "Timer". Hier ist, was ich versuche zu erreichen:Android - Führen Sie einen Thread wiederholt innerhalb eines Timers

Bei Voreinstellungen, gibt es eine Einstellung (Kontrollkästchen), um den wiederholenden Job zu aktivieren/deaktivieren. Wenn diese Checkbox aktiviert ist, sollte der Timer anfangen zu arbeiten und der Thread sollte alle x Sekunden ausgeführt werden. Wenn das Kontrollkästchen deaktiviert ist, sollte der Timer gestoppt werden.

Hier ist mein Code:

prüfen, ob, wenn Kontrollkästchen aktiviert ist oder nicht, wenn geprüft ‚refreshAllServers‘ Leere ausgeführt wird, die den Job mit Timer tut.

boolean CheckboxPreference = prefs.getBoolean("checkboxPref", true); 
       if(CheckboxPreference == true) { 
        Main main = new Main(); 
        main.refreshAllServers("start"); 
       } else { 
        Main main = new Main(); 
        main.refreshAllServers("stop"); 
       } 

Der refreshAllServers Leere, die den Timer Job macht:

public void refreshAllServers(String start) { 

    if(start == "start") { 

     // Start the timer which will repeatingly execute the thread 

    } else { 

     // stop the timer 

      } 

Und hier ist, wie ich meinen Thread ausführen: (Funktioniert gut ohne Timer)

Thread myThread = new MyThread(-5); 
       myThread.start(); 

Was habe ich versucht?

Ich versuchte jedes Beispiel, das ich von Google sehen konnte (Handler, Timer) keiner von ihnen arbeitete, ich schaffte es, den Timer einmal zu starten, aber es zu stoppen hat nicht funktioniert. Der simpliest & verständlich Code, den ich in meiner Forschung sah, war dies:

new java.util.Timer().schedule( 
     new java.util.TimerTask() { 
      @Override 
      public void run() { 
       // your code here 
      } 
     }, 
     5000 
); 
+1

Prüfen Sie, ob die Antwort [hier] (http://stackoverflow.com/questions/8098806/where-do-i-create-and-use-scheduledthreadpoolexecutor-timertask-or-handler/8102488#8102488) hilft. – yorkw

Antwort

34

Einfach nur unter Verwendung Snippet

private Handler handler = new Handler(); 
private Runnable runnable = new Runnable() { 
    public void run() { 
     // 
     // Do the stuff 
     // 

     handler.postDelayed(this, 1000); 
    } 
}; 
runnable.run(); 

Um es

handler.removeCallbacks(runnable); 

verwenden zu stoppen sollte es tun.

+0

Ihre Lösung hat auch gut funktioniert, da ich eine andere Lösung gefunden habe. – sarkolata

+0

Ich denke, das ist die beste Lösung. –

+2

Was ist, wenn der Benutzer etwas erreichen möchte, das eine Verbindung zum Internet nutzt? Durch die Anwendung des oben genannten Befehls werden der Handler und der ausführbare Lauf im UI-Thread ausgeführt, wodurch Netzwerkvorgänge verhindert werden. Sie müssen den Thread dort implementieren. – tony9099

1

Ich denke, würde Alarmmanager http://developer.android.com/reference/android/app/AlarmManager.html

zu verwenden Wenn Checkbox auf Call-Methode ist, wo

AlarmManager alarmManager = (AlarmManager)SecureDocApplication.getContext() 
    .getSystemService(Context.ALARM_SERVICE); 
PendingIntent myService = PendingIntent.getService(context, 0, 
       new Intent(context, MyService.class), 0); 

long triggerAtTime = 1000; 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, 5000 /* 5 sec*/, 
       myService); 

Wenn Checkbox deaktiviert ist Alarmmanager abbrechen

alarmManager.cancel(myService); 
+0

Und welches ist der Teil, dass ich meinen Code einfügen werde? – sarkolata

+1

Haben Sie eine Klassenmitgliedsvariable, die Instanz des Alarmmanagers ist. Wenn das Kontrollkästchen aktiviert ist, rufen Sie eine Methode mit diesem Code auf. wenn aus Anrufmethode, um den Alarmmanager herunterzufahren. Es wird passieren, wenn der Benutzer durch Aktivitäten blättert, und dann in der geerbten Klasse Application. Wenn der Benutzer die App beenden kann und diese noch ausgeführt werden muss, dann im Dienst. – Maxim

1

Verwenden Sie einen CountDownTimer. So wie es funktioniert, wird es eine Methode bei jedem Tick des Timers aufrufen, und eine andere Methode, wenn der Timer endet. An diesem Punkt können Sie bei Bedarf neu starten. Außerdem denke ich, dass Sie wahrscheinlich AsyncTask statt Threads starten sollten. Bitte versuchen Sie nicht, Ihre eigenen Threads in Android zu verwalten. Versuchen Sie es wie folgt. Es läuft wie eine Uhr.

CountDownTimer myCountdownTimer = new CountDownTimer(30000, 1000) { 

public void onTick(long millisUntilFinished) { 
    mTextField.setText("seconds remaining: " + millisUntilFinished/1000); 
    // Kick off your AsyncTask here. 
} 

public void onFinish() { 
    mTextField.setText("done!"); 
    // the 30 seconds is up now so do make any checks you need here. 
} 
}.start(); 
+0

Dies wiederholt nicht die Sache. Es hat dann einmal aufgehört! – sarkolata

+0

Ja, es läuft nicht unbegrenzt. Wenn Sie es auf unbestimmte Zeit ausführen möchten, könnten Sie einen Hintergrunddienst in Erwägung ziehen. Auf der anderen Seite gibt es nichts, was Sie daran hindert, den Countdown-Timer neu zu starten, wenn die Bedingungen stimmen, oder eine längere Dauer einzustellen. –

2

Danke an alle, ich habe dieses Problem mit Timer behoben.

   timer = new Timer(); 
      timer.scheduleAtFixedRate( 
         new java.util.TimerTask() { 
          @Override 
          public void run() { 
           for(int i = 0; i < server_amount; i++) { 
             servers[i] = "Updating...";          handler.sendEmptyMessage(0); 
             new MyThread(i); 
             myThread.start(); 
         } 


        }}, 
        2000, 5000 
        ); 
+0

Bitte geben Sie die Vorteile dieser Lösung gegenüber den anderen an. Ich sehe es nicht. –

+0

Keine Vorteile, ich habe gerade herausgefunden, dass die Antwort von Coders Paradise auch funktioniert, nachdem ich meine Arbeit bekommen habe. – sarkolata

0

„[ScheduledThreadPoolExecutor] Klasse ist vorzuziehen, Timer, wenn mehrere Arbeiter-Threads benötigt werden, oder wenn die zusätzliche Flexibilität oder Fähigkeiten der ThreadPoolExecutor (die diese Klasse erweitert) erforderlich.“

pro ...

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html

Es ist nicht viel mehr als die Handler, sondern hat die Möglichkeit, genau das jeder so oft (vice nach jeder Berechnung Abschluss eine Verzögerung) laufen.

import java.util.concurrent.ScheduledThreadPoolExecutor; 
import java.util.concurrent.TimeUnit; 


... 


final int THREAD_POOL_SIZE = 10; 
final int START_DELAY = 0; 
final int TIME_PERIOD = 5; 
final TimeUnit TIME_UNIT = TimeUnit.SECONDS; 

ScheduledThreadPoolExecutor pool; 

Runnable myPeriodicThread = new Runnable() { 
    @Override 
    public void run() { 
     refreshAllServers(); 
    } 
}; 


public void startTimer(){ 

    pool.scheduleAtFixedRate(myPeriodicThread, 
      START_DELAY, 
      TIME_PERIOD, 
      TIME_UNIT); 

} 

public void stopTimer(){ 

    pool.shutdownNow(); 

} 
Verwandte Themen