2016-12-30 5 views
-2

Meine App muss regelmäßig Daten aus dem Internet abrufen und sich alle 5 Minuten aktualisieren. Zum gleichen Zweck habe ich Asynctask verwendet, um den Inhalt abzurufen und im Hintergrundthread zu verarbeiten, bevor er an den UI-Thread gesendet wurde. Vor kurzem habe ich Asynctask Loader und seine Vorteile kennengelernt. Ich bin jedoch nicht in der Lage, herauszufinden, wie der Loader regelmäßig alle 5 Minuten aufgerufen wird, um den Inhalt zu aktualisieren.Android: Async-Task-Loader

(Bitte beachten Sie früher wurde ich Timer mit task.execute() aufrufen. Ich muss schließlich meine Listenansicht aktualisieren, wenn es einen neuen Inhalt.)

Antwort

1

ich Sie Daten für die Aktualisierung alle einen Timer verwenden würde, 5 Minuten. Innerhalb des Timers erstellen Sie eine asynchrone Aufgabe. Holen Sie die Daten in doInBackground(). Aktualisieren Sie die Benutzeroberfläche unter onPostExecute(). Sie können die Daten, die Sie in doInBackground() abgerufen haben, an onPostExecute() übergeben. Weitere Informationen finden Sie unter: https://developer.android.com/reference/android/os/AsyncTask.html

+0

Das habe ich bisher gemacht. Ich lese jedoch, dass rotierende Bildschirme die Aktivität neu starten würden und daher Loader besser als Asyntasks sind. Was denken Sie? Gibt es eine Möglichkeit, Loader zu verwenden und die Daten regelmäßig zu aktualisieren? –

+0

Überprüfen Sie dies: http://stackoverflow.com/questions/7120813/asynctaskloader-vs-asynctask – beeb

1

Wenn Sie möchten, dass Ihr Code nur ausgeführt wird, wenn Ihre App ausgeführt wird, um regelmäßig eine Aufgabe aufzurufen und nach dem Abrufen Ihrer Informationen etwas in Ihrem UIhread auszuführen, können Sie ScheduledExecutorService verwenden.

In Ihrer Tätigkeit erklären:

private ScheduledExecutorService scheduleTaskExecutor; 

scheduleTaskExecutor = Executors.newScheduledThreadPool(5); 

Future<?> future = scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
    @Override 
    public void run() { 
     // Fetch your data 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       // Do the update in your UI 
      } 
     }); 

    } 
}, 0, 5, TimeUnit.MINUTES); 

Wo scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

Wenn Sie Ihre ScheduledExecutorService in Ihre Tätigkeit abzubrechen es später wieder zu verwenden, zu verwenden:

future.cancel(true); 

Wenn Sie möchten den Dienst entfernen, verwenden Sie:

scheduleTaskExecutor.shutdown(); 
1

Ich habe es endlich herausgefunden.

Bei der Verwendung von Loadern müssen wir restartLoader anstelle von initLoader verwenden, wenn wir den Loader regelmäßig mit neuen Daten aktualisieren müssen. RestartLoader beendet den vorherigen Loader und erstellt einen neuen Loader, während initLoader die Erstellung eines neuen Loaders ignoriert, wenn bereits ein Loader mit dieser ID vorhanden ist.

Verwandte Themen