2017-08-31 3 views
1

Je travaille sur une application Xamarin.Forms,ImageSource ne sont pas éliminés et la création OutOfMemoryException

A l'intérieur d'une de ma page, j'ai plusieurs coutume stackLayout (ActivityTypeView) contenant une image. Ces StackLayout sont créés et ajoutés dynamiquement dans une grille dans ma page.

intérieur de mon ActivityTypeView je mis la source de l'image comme suit:

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

(Mon image est enregistrée dans mon dossier drawable)

Le problème est que quand je vais à une autre page et de revenir multiples temps, je finis toujours à un moment donné par une exception OutOfMemory lorsque je tente de charger l'image.

Je pense que mon ImageSource n'est pas détruite/jetée quand je change de page. Donc, il sera toujours, après avoir rechargé la même page plusieurs fois, se retrouver avec cette erreur.

Je voudrais savoir comment gérer cette situation. Comment puis-je disposer correctement de la ressource et quand?

Répondre

1

J'ai pris l'habitude d'utiliser le FFImageLoadingLibrary qui prend soin de mettre en cache et de réutiliser correctement les ressources d'image. Par exemple, dans votre cas, cela vous aidera à toujours utiliser la même image en mémoire au lieu d'en charger une nouvelle à chaque fois, ce qui finira par aboutir à une exception OutOfMemoryException.

Vous pouvez simplement remplacer toutes les classes Image par CachedImage et définir un certain nombre de propriétés qui contrôlent la mise en cache, le sous-échantillonnage et d'autres choses. Voici la documentation: Xamarin.Forms API

+0

L'utilisation de FFImageLoadingLibrary a corrigé mon crash! Je voulais utiliser Xamarin profiler pour voir ce qui se passe avec la mémoire mais je ne possède pas Visual Studio Enterprise pour surveiller mon application. Savez-vous si la mémoire est libérée à un moment donné? Ou la bibliothèque cache juste l'image pendant que l'application est en cours d'exécution? –

+0

@LucienMoor Heureux d'entendre ça! Dans mon cas, la bibliothèque charge une fois l'image en mémoire et la réutilise encore et encore. De cette façon, nous n'avons pas vraiment à nous soucier de la libération de la mémoire. Vous remarquerez que l'utilisation de la bibliothèque en vaut vraiment la peine à long terme. – hankide

1

Je ne suis pas sûr que votre image est grande, mais si c'est le cas, vous ne devriez pas charger l'ensemble du fichier image dans la mémoire. Here est un moyen de charger l'image avec des limites d'imageview. C'est pour Android mais sûrement il y a un équivalent pour Xamarin.Forms

+0

Mes images ne sont pas si grandes, mais le redimensionnement de l'image pourrait aider! la bibliothèque proposée dans la réponse acceptée nous permet de le faire! –