3.14.4. Image Provider

Ein Image Provider ist eine Image Konstante und ein Image Descriptor zugleich. Ein Image Provider muss nicht explizit in der Image Registry registriert werden. Bei der ersten Verwendung wird mit Hilfe des Image Descriptor Anteil ein Image Handle erzeugt und für die Image Konstante registriert. Dadurch spart man sich zum Beispiel das Halten von Schlüsseln in der Image Registry für Icons, welche gar nicht zur Laufzeit verwendet, aber in einer Icon Bibliothek vorhanden sind. Derzeit werden zwei Image Provider Typen unterstützt, der IImageUrlProvider und der IImageStreamFactoryProvider.

Image Url Provider

Die Schnittstelle IImageUrlProvider hat die folgende Methode:

    URL getImageUrl();

Die Klasse ImageUrlProvider implementiert diese Schnittstelle und zudem auch die Schnittstelle ICacheable, wodurch ein ImageUrlProvider mittels release() aus der Image Registry entfernt werden kann. Das folgende Beispiel demonstriert die Verwendung der Klasse ImageUrlProvider:

  1      final ImageUrlProvider icon = new ImageUrlProvider(iconFile);
  2  
  3      button1.setIcon(icon);
  4      button2.setIcon(icon);
  5      
  6      ...
  7      
  8      button1.dispose();
  9      button2.dispose();
 10      
 11      //release the icon from the image registry if no longer used
 12      icon.release();

Der ImageUrlProvider wird in Zeile 1 erzeugt und in Zeile 12 wieder released. Da es sich um einen Image Provider handelt, ist ein explizites registrieren in der Image Registry nicht notwendig. Für beide Widgets wird nur ein Image Handle erzeugt, welches bei der ersten Verwendung automatisch in der Image Registry registriert wird. Man muss sich selbst darum kümmern, die Konstante, wenn sie nicht mehr benötigt wird, aus der Image Registry zu entfernen. Mit dem folgenden Code würde man das gleiche wie mit icon.release() erreichen:

    Toolkit.getImageRegistry().unRegisterImageConstant(icon);

Anmerkung: Gemeinsam genutzte Icons sollten besser in einer dauerhaft gültigen Konstante, wie zu Beispiel einer Enum gehalten, und nur in Ausnahmefällen disposed werden. Durch das Disposen von Icons welche man mehrfach verwendet, können Fehler auftreten, welche unter Umständen nur schlecht reproduzierbar sind. Da man in der Regel (auch in großen Applikationen) nicht Unmengen von unterschiedlichen Icons verwendet, und diese somit auch nicht unverhältnismäßig viel Speicher benötigen, könnte man das Disposen von momentan nicht verwendeten Icons unter Umständen als verfrühte Optimierung (premature optimization) im Sinne von Knuth betrachten. Es gibt jedoch Fälle, wo es sinnvoll sein mag aufzuräumen, zum Beispiel wenn mit Hilfe eines Icon Chooser alle verfügbaren Icons einer Bibliothek angezeigt und somit auch geladen wurden. Hier ist es durchaus sinnvoll, diese Icons anschließend wieder aus der Image Registry zu entfernen.

Image Stream Factory Provider

Die Schnittstelle IImageStreamFactoryProvider hat die folgende Methode:

    InputStream createInputStream();

Der Input Stream wird genau dann erzeugt, wenn ein natives Image benötigt wird. Jeder Aufruf muss einen neuen Input Stream liefern, der insbesondere nicht null sein darf. Der Stream wird vom Aufrufer der Methode geschlossen (close()), wenn er nicht mehr benötigt wird.


Siehe auch PDF Version dieses Dokuments, Jowidgets API Spezifikation