
Die wichtigste Methode, um Speicher einzusparen, besteht darin, nur momentan benötigte Resourcen in Anspruch zu nehmen. Bei Web Dynpro bedeutet dies, nur Components und Views im Speicher zu halten, die gerade angezeigt werden.
Grundvorraussetzung ist dafür, dass eine Anwendung modular strukturiert ist und somit nicht alle Bestandteile immer gleichzeitig halten muss.
Wenn diese Voraussetzungen erfüllt sind, stellt sich die Frage nach dem dynamischen Auf- und Abbau von Components und Views.
Components
Eine Component COMP_A hat eine Component-Usage USAGE_A_B auf eine Component COMP_B. Web Dynpro instanziiert Component COMP_B für die Component-Usage in folgenden Fällen:
Ein Interface-View aus COMP_B wird in einem gerade sichtbaren Window von COMP_A sichtbar gemacht (siehe Views)
Es besteht ein Context-Mapping von COMP_A auf den Context von COMP_B
Andernfalls wird die Component COMP_B nicht automatisch instanziiert. Wird eine Component nicht mehr benötigt, so sollte diese mit DELETE_COMPONENT abgebaut werden. Allerdings dürfen dann keine Views der Component mehr sichtbar sein, und es darf auch kein Context-Mapping bestehen.
Views
Die Lebensdauer einer View wird von ihrer Sichtbarkeit bestimmt: Eine View wird automatisch instanziiert, sobald sie sichtbar gemacht wird. Hat die View die Einstellung Lebensdauer: When visible, dann wird die View abgebaut, sobald sie unsichtbar wird. Andernfalls kann die View nur durch Zerstören der gesamten Component abgebaut werden.
Der Begriff sichtbar ist in Web Dynpro mehrfach belegt und kann daher leicht falsch verstanden werden. Was tatsächlich auf dem Bildschim sichtbar ist, hängt letztendlich von den in der View-Assembly sichtbaren Views und der Sichtbarkeit der einzelnen UI-Elemente (Eigenschaft visibility) ab.
Wenn wie oben über die Sichtbarkeit von Views gesprochen wird, dann ist die View-Assembly gemeint. Die View-Assembly ist der Baum von sichtbaren Views eines Windows. Pro Window und View-Container ist immer eine View sichtbar. Ob eine View instanziiert wird oder nicht hängt nur von der View-Assembly und nicht von der Sichtbarkeit von UI-Elementen ab.
Eine View wird sichtbar gemacht und somit auch instanziiert, wenn sie in einem sichtbaren Window eingebettet ist und als Default-View markiert ist, oder zu der navigiert wird, indem einer seiner Inbound-Plugs angesprochen wird. Sie wird unsichtbar, wenn zu einer anderen View im gleichen Window oder View-Container navigiert wird.
Beachten Sie, dass zum Umbau der View-Assembly grundsätzlich ein Navigationsrequest (Outbound-Plug) gefeuert werden muss.
Szenarien für Speicher-Einsparungen
Verwendeung von Lebensdauer: When visible
Durch Verwenden dieser Einstellung erreichen Sie, dass die View abgebaut wird, wenn sie durch Navigation (wie oben beschrieben) unsichtbar wird. Sie sollten diese Einstellung wählen, wenn die View nicht ständig wiederholt in der Anwendung verwendet wird.
Wird die View unsichtbar, dann läuft Folgendes ab: Die Methode WDDOEXIT wird aufgerufen. Der View-Controller und dessen Attribute, der lokale View-Context und der UI-Element-Baum werden abgebaut. Beachten Sie, dass der Speicher nur dann freigegeben werden kann, wenn diese nicht von anderen Objekten referenziert werden. Halten Sie sich deshalb keine Referenzen vom View, Context, UI-Elementen oder Context-Knoten, Elementen, Node-Infos etc. außerhalb der View. Anderenfalls ist der Applikationsentwickler selbst für den Abbau dieser Referenzen zuständig.
Falls Sie den UI-Zustand (beispielsweise die erste sichtbare Tabellenzeile) für eine mögliche spätere Rückkehr halten möchten, dann müssen Sie diesen außerhalb der View ablegen: Zum Beispiel als Attribut an der Assistance-Klasse oder als Attribut eines Context-Knotens des Component-Controllers, der in die View gemappt wird.
Dynamisches Sichtbarmachen von Views
Betten Sie im View-Container für VIEW_A im Window die View VIEW_B und die EMPTY_VIEW ein. Setzen Sie die EMPTY_VIEW als Default. Legen Sie für VIEW_A einen Outbound-Plug TO_VIEW_B und für VIEW_B einen Inbound-Plug IN an. Verbinden Sie die beiden Plugs im Window.
Damit erreichen Sie, dass die VIEW_B nicht automatisch mit der VIEW_A instanziiert wird. Stattdessen wird die EMPTY_VIEW als Platzhalter verwendet. Durch Feuern des Plugs TO_VIEW_B wird VIEW_B dann sichtbar gemacht. Sie können den Plug dann auch verwenden, um VIEW_B mitzuteilen, was für ein Objekt sie anzeigen soll.
TabStrip: Nur für für aktiven Tab sichtbar machen
Jeder Tab eines TabStrips soll eine andere View sichtbar machen. Dazu muss für jeden Tab ein ViewContainerUIElement angelegt werden, das wiederum ein View-Container im Window mit sich bringt. In den View-Containern wird die jeweils anzuzeigende View eingebettet. Da es immer eine Default-View pro View-Container geben muss, sind sie somit alle Default-Views. Das führt wiederum dazu, dass alle Views sofort instanziiert werden. Gehen Sie daher vor, wie im folgenden Beispiel beschrieben.
Beispiel-Anwendung DEMO_TABSTRIP_VIEWS
Im TABSTRIP_VIEW wird ein Outbound-Plug TO_TAB definiert mit dem Parameter TAB type STRING und OLD_TAB type STRING. Der onSelect-Event ruft eine Action, die den Outbound-Plug feuert, die Parameter TAB und OLD_TAB werden jeweils mit den gleichnamigen Event-Parametern befüllt.
Im Window wird ein Inbound-Plug SHOW_TAB definiert mit dem gleichen Parameter. Die Plugs werden miteinander verbunden. Für jeden View-Container eines Tabs wird die anzuzeigende View und die EMPTY_VIEW eingebettet. Die EMPTY_VIEW wird für alle Views außer der initial sichtbaren View zum Default. Für jeden Tab wird nun im Window jeweils ein Outbound-Plug zum sichtbar und unsichtbar machen der View angelegt. Der Plug zum sichtbar machen wird mit dem Inbound-Plug der entsprechenden View und der zum unsichtbar machen mit dem der Empty-View verbunden.
Im Coding des SHOW_TAB Inbound-Plugs werden die beiden Case-Anweisung implementiert, wie im Folgenden beschrieben.
method handleshow_tab .
case old_tab.
when 'TAB_1'.
wd_this->fire_hide_tab_1_plg( ).
when 'TAB_2'.
wd_this->fire_hide_tab_2_plg( ).
when 'TAB_3'.
wd_this->fire_hide_tab_3_plg( ).
when others.
" Unknown tab
assert 1 = 2.
endcase.
case tab.
when 'TAB_1'.
wd_this->fire_show_tab_1_plg( ).
when 'TAB_2'.
wd_this->fire_show_tab_2_plg( ).
when 'TAB_3'.
wd_this->fire_show_tab_3_plg( ).
when others.
" Unknown tab
assert 1 = 2.
endcase.
endmethod.
Beachten Sie, dass SAP_BASIS 700 SP15 oder SAP_BASIS 700 EhP1 notwendig ist, damit der Speicher beim Abbau von Views und Components vollständig vom Web-Dynpro-Framework freigegeben wird.
Siehe auch SAP Hinweis
1067051
.