android lädt Daten asynchron im View-Pager

8

Ich brauche eine Lösung für die Pager-Implementierung. Erstens lade ich riesige Daten von der Datenbank in einzelne Seite, so manchmal während des Swipe verlangsamt die Wischfrequenz (Sie müssen mehrere Zeit Swipe auf der Seite), wie im Hintergrund, es macht Aufgabe zu holen. Ich verwende keine asynchrone Aufgabe zum Zurückgeben der Ansicht. Gibt es eine Möglichkeit, Seiten lazy zu laden, lassen Sie den Benutzer einfach auf andere Seite auf Swipe gehen, aber Daten ist faul geladen.

Mein Codebeispiel ist wie folgt:

%Vor%

Ich rufe dies bei create method an.

%Vor%

Gibt es eine Lösung?

    
Hanry 22.05.2012, 13:30
quelle

6 Antworten

17

Ich würde vorschlagen, mit Fragmenten zu arbeiten (und nicht direkt mit Ansichten).

Sie benötigen eine Schnittstelle auf Ihren Fragmenten, um ihnen mitzuteilen, wann sie angezeigt werden:

%Vor%

Aktivieren Sie alle Ihre Fragmente, um diese Schnittstelle zu implementieren, und rufen Sie in dieser Methode Ihre Loader / asyncTasks / Hintergrundaufgaben auf.

Fügen Sie dann einen onPageChangeListener auf Ihrem ViewPager ein. Wenn Sie feststellen, dass der Benutzer die Seite geändert hat, rufen Sie die Schnittstellenmethode für Ihr Fragment auf. Sie haben bei diesem Listener einige Möglichkeiten, mit einer der Methoden zu warten, bis der viewPager aufhört zu rutschen, um den Interface-Aufruf auszulösen.

Um das richtige Fragment für diesen Aufruf zu erhalten, nehmen Sie das Fragment von yourFragmentApadter.instantiateItem (ViewGroup, int), das das Fragment für diese Position zurückgibt, wenn es bereits geladen ist.

%Vor%

So können Sie Ihre Fragmente mit leeren Ansichten vorbereiten und wenn Sie auf eine davon gleiten, beginnen Sie mit dem Laden der Daten.

    
galex 22.05.2012 13:45
quelle
3

Ich habe gerade eine sehr ähnliche Aufgabe erledigt. Um die Lösung Ihres Problems zu finden, sollten Sie folgende Punkte beachten:

  1. Sehen Sie, ob Sie alle dieser Daten in der ersten Instanz abrufen müssen. Fühlen Sie sich frei, mit einigen Details zu veröffentlichen, welche Informationen Sie geladen werden müssen und was Sie damit tun (Anzeige als Liste auf dem Bildschirm?)
  2. Sehen Sie sich an, dass Sie CursorLoader s verwenden, die schwere Aufgaben wie das asynchrone Abrufen von Datenbanken ausführen. Dieses Tutorial zu den Interwebs stellt den ContentProvider Android-Ansatz vor. Am besten machen Sie sich mit der offiziellen Android URI- und ContentProvider-Dokumentation vertraut, wenn diese Begriffe nicht viel bedeuten.
  3. Wenn Sie mit Fragmenten arbeiten - Sehen Sie sich die FragmentStatePagerAdapter anstelle der traditionellen FragmentPagerAdapter an. Ich habe diesen Adapter nicht benutzt, aber ich habe gelesen, dass er nur das gerade sichtbare Fragment instanziiert, d. H. Nicht die Fragmente rechts oder links von der aktuell ausgewählten Registerkarte.
  4. Sehen Sie sich die Abfrage an, die Sie für die DB ausführen.
OceanLife 22.05.2012 14:29
quelle
1

instantiateItem wird aufgerufen, wenn ViewPager gerade ausgetauscht wird und eine Ansicht benötigt. Es hat nicht um wirklich alles zu erstellen. Ich denke, letztendlich ist Lazy-Loading out. So wie ich es sehe, gibt es zwei Dinge, die du hier tun musst.

1: Zwischenspeichern Sie die Daten im Hintergrund, wenn der Benutzer Ihre Seite erreichen möchte. Ihr Beispiel behauptet, dass 364 Seiten (guter Gott), so würde ich sagen, verwenden Sie einen Listener, um Seitenänderungen zu behandeln. Wenn Sie auf Seite 363 sind, beginnen Sie mit dem Laden der Daten für 364. Wenn Sie bei 364 sind, laden Sie die Daten bei 365 und behalten Sie die Daten bei 363 für den Fall, dass der Benutzer zurück tauschen möchte. Wenn die Daten relativ schnell geladen werden oder der Benutzer eine lange Zeit für den Austausch benötigt, sollte dies kein Problem sein, wenn Sie asyncTask oder einen Thread zum Laden der Daten verwenden.

2: Verfügen über eine Standardbackupansicht, die erst beim Abrufen der Daten ausgefüllt wird. Sie müssen dies auch mit Option 1 tun, wenn der Benutzer die Seite lädt, bevor Sie die Daten abrufen. Im Grunde, haben Sie einfach eine Ansicht, die sagt "loading ..." oder etwas, bis Sie die Daten haben. Entweder das, oder füllen Sie die Daten in Echtzeit, wie Sie es bekommen. In diesem Fall sieht der Benutzer das Build.

Wie auch immer, ich denke, Sie müssen etwas zwischenspeichern, damit die App gut aussieht.

    
DeeV 22.05.2012 13:47
quelle
1

Ich hatte ein ähnliches Problem. Ein Viewpager, der schwere Daten geladen hat. Wenn Sie die Ansichten der einzelnen Seiten nicht häufig ändern, würde ich vorschlagen, dass Sie die Seiten im Speicher behalten. Verwenden Sie den folgenden Code, um dies durchzuführen

%Vor%

Wenn Sie Daten auf den ViewPager-Folien aktualisieren möchten, verwenden Sie

%Vor%

Und benutze FragmentStatePagerAdapter.

    
RaWa 30.01.2013 16:18
quelle
0

Ich glaube nicht, dass es eine Möglichkeit gibt, Daten auf die von Ihnen beschriebene synchrone Art zu laden. AsyncTask ist der Weg zu gehen oder vielleicht könnten Sie Threads direkt verwenden. Ich glaube, dass AsyncTask speziell für diese Art von Funktionalität entwickelt wurde. Es ist einfacher, den Thread dann direkt zu verwenden. Wenn Sie Ideen zur Implementierung benötigen, werfen Sie einen Blick auf: Ссылка

    
Code Poet 22.05.2012 13:36
quelle
0

Haben Sie sich in android ignition library umgeschaut? nach Sample-Anwendungen gibt es eine Komponente "Endless List" und eine http-Cache-Komponente.

Ich habe es selbst nicht versucht und weiß nicht, ob das eine Lösung für dich ist - hab nur die Beispiele gesehen .....

    
k3b 22.05.2012 13:56
quelle