2017-08-31 2 views
1

ich auf einer Xamarin.Forms Anwendung arbeite,Image nicht entsorgt und die Schaffung von OutOfMemoryException

Innerhalb eines meiner Seite habe ich mehrere benutzerdefinierte StackLayout (ActivityTypeView) ein Bild enthält. Diese StackLayout-Objekte werden dynamisch in einem Raster auf meiner Seite erstellt und hinzugefügt.

In meinem ActivityTypeView stelle ich die Bildquelle wie folgt:

WorkIcon.Source = ImageSource.FromFile("disable.png"); 

(Mein Bild ist in meinem ziehbar Ordner gespeichert)

Das Problem ist, dass, wenn ich auf eine andere Seite gehen und kommen wieder mehrere Ich komme irgendwann immer mit einer OutOfMemory Exception, wenn ich versuche, das Image zu laden.

Ich denke irgendwie meine ImageSource wird nicht zerstört/Disposed, wenn ich Seite ändere. So wird es immer, nachdem ich dieselbe Seite mehrere Male neu geladen habe, mit diesem Fehler enden.

Ich würde gerne wissen, wie man mit dieser Situation umgeht. Wie kann ich die Ressource ordnungsgemäß und wann entsorgen?

Antwort

1

Ich habe eine Angewohnheit der Verwendung der FFImageLoadingLibrary, die für die ordnungsgemäße Zwischenspeicherung und Wiederverwendung der Bildressourcen kümmert. In Ihrem Fall würde es beispielsweise hilfreich sein, immer dasselbe In-Memory-Image zu verwenden, anstatt jedes Mal ein neues zu laden, was schließlich zu einer OutOfMemoryException führt.

Sie können einfach alle Image-Klassen durch den CacheImage ersetzen und einige Eigenschaften festlegen, die Caching, Downsampling und andere Dinge steuern. Hier ist die Dokumentation: Xamarin.Forms API

+0

Mit FFImageLoadingLibrary meinen Absturz behoben! Ich wollte den Xamarin-Profiler verwenden, um zu sehen, was mit dem Speicher passiert, aber ich besitze kein Visual Studio Enterprise, um meine App zu überwachen. Wissen Sie, ob der Speicher irgendwann frei ist? Oder die Bibliothek nur das Bild zwischenspeichern, während die App läuft? –

+0

@LucienMoor Freut mich zu hören! In meinem Fall lädt die Bibliothek das Bild einmal in den Speicher und verwendet es wieder und wieder. Auf diese Weise müssen wir uns keine Sorgen machen, dass die Erinnerung freigegeben wird. Sie werden feststellen, dass sich die Verwendung der Bibliothek auf lange Sicht wirklich lohnt. – hankide

1

Ich bin mir nicht sicher, Ihr Bild ist groß, aber wenn es ist, sollten Sie nicht die gesamte Bilddatei in den Speicher laden. Here ist eine Möglichkeit, das Bild mit Bildbereichsgrenzen zu laden. Es ist für Android, aber es gibt sicherlich ein Äquivalent für Xamarin.Forms

+0

Meine Bilder sind nicht so groß, aber die Größe des Bildes könnte helfen! die Bibliothek, die in der angenommenen Antwort vorgeschlagen wird, erlaubt uns, es zu tun! –