Verhindern, dass WebView in FragmentPagerAdapter neu geladen wird?

8

Ich habe einen FragmentPagerAdapter, um ungefähr 6 Tabs anzuzeigen, die alle ihre Daten von einem Webserver laden. Eine der Register enthält ein WebView, das ein Bild von meinem Server lädt. Die serverseitigen Kosten für die Erstellung des Images sind hoch, und daher möchte ich die Anzahl der Aufrufe zum erneuten Laden des WebView reduzieren. Für die Nicht-WebView-Registerkarten konnte ich meinen Status speichern (z diese, nur ein einfaches Array) und sie wiederherstellen, wie Registerkarten durchlaufen werden.

Problem:

  • WebView wird jedes Mal neu geladen, wenn ich mit FragmentPagerAdapter zurückwische, was zu hohen Ladezeiten und hoher Belastung meines Webservers führt.

Berücksichtigte Lösungen:

  • Verwenden Sie ViewPager.setOffscopePageLimit () Dies ist problematisch, weil dadurch mehr Registerkarten geladen werden müssen, selbst wenn sie nie angezeigt werden. Das ist unnötig teuer auf meinem Server.
  • Verwenden Sie WebView.saveState () und WebView.restoreState () Die Dokumentation wurde aktualisiert, um zu verdeutlichen, dass der Anzeigestatus hier nicht mehr beibehalten wird. Dies ist für dieses Szenario nicht mehr nützlich.
  • Legen Sie fest, dass meine Aktivität folgendes haben soll: android: configChanges="keyboardHidden | orientation | screenSize" Dies gilt für den Rotationsfall, hat jedoch keinen Einfluss auf die Registerkarte Durchsicht der ViewPager / FragmentPagerAdapter.

Es klingt wie das alte Verhalten von WebView.saveState ( ) wäre perfekt gewesen ...

    
RealCasually 27.01.2013, 21:13
quelle

1 Antwort

12

Das Problem scheint zu sein, dass Sie Ihre eigenen Ergebnisse löschen.

Während Sie bei einer Konfigurationsänderung ein neues WebView benötigen, brauchen Sie andernfalls kein neues WebView . Und wenn du bereits WebView hast, musst du nichts dazu sagen.

Also, ich würde es versuchen:

  • Halten Sie die WebView , die Sie in onCreateView() in einem Datenelement des Fragments
  • erstellt haben
  • Nur das Layout in onCreateView() aufblasen, wenn dieses Datenelement null ist
  • Rufen Sie loadUrl() nur auf, wenn Sie das Layout aufgebläht haben

(Wenn Sie den WebView im Java-Code erstellen, ersetzen Sie "das Layout aufblasen" mit "create the WebView über seinen Konstruktor")

Wenn der Inhalt des Fragments mehr als WebView beträgt, müssen Sie auch die Root-Ansicht beibehalten, die Sie in einem Datenelement aufgebläht haben, sodass Sie diese aus onCreateView() zurückgeben können.

    
CommonsWare 27.01.2013, 21:49
quelle