Daten im Hintergrundabholen?

  • Antworten:8
Ben Becker
  • Forum-Beiträge: 209

16.09.2011, 14:16:19 via Website

Hiho!
Irgendwie stehe ich gerade auf dem Schlauch. Meine App holt ihre Daten per Async Task ab. Das klappt so weit auch ganz gut. Diese Daten sollen auch weiter so abgerufen werden, da ich dann ja das "Laden" Swirl einblenden kann.

Jetzt habe ich aber noch weitere Daten die ich abrufen mag. Und da komme ich nicht so recht auf einen Begriff nach dem ich suchen sollte. Ich weiß aber auch nicht ob das geht. Und zwar wird die App an einer Stelle mit vorgegeben Werten ausgeliefert. Diese reichen auch für den Start der App aus. Der Daten sind einfach in der App gespeichert und zwar in den Shared Preferences. Wenn der User die App startet soll diese im Hintergrund nachschauen ob neue Daten da sind und diese dann einfügen. Der User soll davon aber nichts bemerken und ganz normal mit der App weiter arbeiten können. Also ich die Activity wechseln können und so. Geht das? Mit was mache ich das?

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

16.09.2011, 14:52:08 via Website

Werden die Daten überall in Deiner App benötigt oder nur in einer ListView o.ä.? Werden die Daten nur zu Anzeige benötigt oder werden die auch in einer DB abgespeichert?

Davon hängen die Stichworte ab.

ListView, die nach dem "Überscrollen" Daten nachlädt --> Lazy Load.

Persistent abspeichern -> Service mit Thread.

Antworten
Ben Becker
  • Forum-Beiträge: 209

16.09.2011, 15:29:29 via App

die daten sollen dauerhaft gespeichert werden da sie öfter gebraucht werden. Dann werde ich mir mal Service anschauen und ob ich da was finde. danke schon mal.

Antworten
Florian B.
  • Forum-Beiträge: 284

16.09.2011, 16:05:21 via Website

Eine weitere Option wäre es ein Application Klasse zu implementieren und dort den AsyncTask laufen zu lassen, dann braucht man sich nicht mit einem Service rumschlagen. Allerdings besteht hier natürlich die Gefahr, dass wenn die App geschlossen wird, auch der AsyncTask abgebrochen wird.

— geändert am 16.09.2011, 16:08:57

Antworten
Ben Becker
  • Forum-Beiträge: 209

20.09.2011, 16:16:35 via Website

Geht das ganze denn auch mit einem TimerTask oder sollte man das nicht machen?

[code]
import java.util.Timer;
import java.util.TimerTask;

import de.sportwetten-blogger.tools.MyRequest;

public class Datenabrufen {

public void abruf(){
Timer t = new Timer();

t.schedule(new TimerTask() {

@Override
public void run() {
String url="http://www.testseite.de/";

String text= new MyRequest().getRequest(url);
System.out.println("Ben "+text);

}
}, (long)0, (long)1000);
}
}
[/code|

Aufruf in der Activity mit
Datenabrufen daten=new Datenabrufen();
daten.abruf();

Das abrufen muss nur solange funktionieren wie die Activity gestartet ist, evt kann man das dann auch in onResume schreiben. Was denkt ihr? Ich brauche nur das und die Daten die abgerufen werden kommen in einen SharedPreferences.

Antworten
Markus B.
  • Forum-Beiträge: 636

20.09.2011, 16:32:40 via Website

Hi, das kannst du prinzipiell so machen. Allerdings steht in der API zum java.util.Timer folgendes: "Prefer ScheduledThreadPoolExecutor for new code."
Somit würde ich es dann auch so machen. Also benutzt besser den ScheduledThreadPoolExecutor.

Gruß,
Markus

Antworten
Ben Becker
  • Forum-Beiträge: 209

20.09.2011, 16:56:14 via Website

Hiho!
Ok schaue ich mir auch mal an.
Fand das mit dem Service etwas viel, da die App das ja wirklich nur brauch wenn sie läuft. Und dann nur am Anfang und dann so alle 10 Minuten. Wobei ich glaube kein User hat meine App 10 Minuten offen.
Der Service ist ja eher gedacht wenn ich Daten abrufe, auch wenn die App geschlossen ist, oder?

Antworten
Markus B.
  • Forum-Beiträge: 636

20.09.2011, 17:19:47 via Website

Hi,
zum Thema Services: Hier gibt es zwei Konzepte.
Zu einen gibt es die "local Services", welche nur laufen wenn deine App läuft. Hier spielt es dann auch keine Rolle, welche Activity gerade geöffnet ist.
Dann gibt es noch die "remote Services", welche auch laufen können wenn die App nicht geöffnet ist.

Somit kannst du für dein Zwecke auch ruhig einen "local Service" benutzten.

Gruß,
Markus

Ben Becker

Antworten