2017-01-16 7 views
0

Ich habe eine AsyncTask, die derzeit nur einmal ausgeführt wird und etwa zwischen 5 und 30 Sekunden dauert.In regelmäßigen Abständen AsyncTask ausführen, nachdem vorherige Aufgabe beendet wurde

Was ich tun möchte, ist:

1. Starten Sie die App
2. Führen Sie den Task-
3. Warten Sie, es zu beenden.
4. Warten Sie eine bestimmte Zeit, z. 5 Sekunden
5. Wiederholen Sie Schritt 2.

Ich sah mich um mehrere Beiträge vorschlagen, die Handlers verwenden und das ist, wie ich habe versucht, es zu tun:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     final Activity activity = this; 

     final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      public void run() { 

       // Start AsyncTask 
       new MyTask(activity).execute(); 
      } 
     }, 5000); //Every 5 seconds 
    } 

MyTask ist eine Unterklasse von AsyncTask in einige andere .java-Datei.

Die Task wird nur einmal beim Start nach einer Verzögerung von 5 Sekunden ausgeführt. Es führt sich nicht wieder so aus, wie es sollte.

Beachten Sie, dass ich die nächste Aufgabe nur ausführen möchte, wenn sie nicht bereits ausgeführt wird, und führe sie 5 Sekunden danach aus.

Also, warum funktioniert es nicht als Ausnahme?

+0

hallo CPX brauchen, ja, eine Lösung für das heißt runnable und Handler verwenden, aber dies nicht tun, Verwenden Sie stattdessen ScheduledThreadPoolExecutor, es ist sicher und wurde im Hinblick auf eine gute Leistung für Android entwickelt. https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html –

Antwort

1

Versuchen Sie, den Handler-Code erneut in die onPostExecute-Methode der AsyncTask einzufügen. Sobald es fertig ist, wartet es 5 Sekunden, um sich selbst wieder zu starten.

hoffen, es hilft;)

0

Hier ist, wie ich meinen Code verwenden, um einen Methodenaufruf ListDevices jede DELAY Zeit zu laufen.

private ScheduledFuture<?> scheduledFutureListDevices 

private void startListDevicesTaskAtRate(int rate) { 

Runnable runnable = this::requestListDeviceService; 

scheduledFutureListDevices = scheduledThreadPoolExecutor.scheduleWithFixedDelay(runnable, DELAY, rate, TimeUnit.SECONDS); 

Log.d(TAG, "STARTING LIST DEVICES TASK AT " + (rate == Constants.FAST_RATE ? " FAST " : " NORMAL ") + " RATE"); 

if (scheduledFutureListDevices != null) { 
    scheduledFutureListDevices.cancel(false); 
} 

Runnable runnable = this::requestListDeviceService; 

scheduledFutureListDevices = scheduledThreadPoolExecutor.scheduleWithFixedDelay(runnable, DELAY, rate, 
     TimeUnit.SECONDS); 
} 

ich das Ergebnis von scheduledThreadPoolExecutor.scheduleWithFixedDelay-scheduledFutureListDevices so bin zuweisen Sie sie abbrechen können oder resumen überall

Verwandte Themen