J'ai donc un chargeur d'images paresseux pour mon ListView
. J'utilise également this tutorial pour une meilleure gestion de la mémoire et j'ai SoftReference
images bitmap stockées dans mon ArrayList
.java.lang.OutOfMemoryError: la taille de l'image dépasse le budget de la machine virtuelle
Mes travaux ListView
charge 8 images d'une base de données puis une fois que l'utilisateur fait défiler vers le bas, il charge 8 autres etc. Il n'y avait aucun problème lorsqu'il y avait environ 35 images ou moins, mais plus et mon application Force se ferme avec OutOfMemoryError
.
La seule chose que je ne comprends pas est que j'ai mon code dans une prise try:
try
{
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(image, 0, image.length, o);
//Find the correct scale value. It should be the power of 2.
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while(true)
{
if(width_tmp/2 < imageWidth || height_tmp/2 < imageHeight)
{
break;
}
width_tmp/=2;
height_tmp/=2;
scale++;
}
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
bitmapImage = BitmapFactory.decodeByteArray(image, 0, image.length, o2);
}
catch (Exception e)
{
e.printStackTrace();
}
Mais le bloc catch try ne rattrape pas l'exception OutOfMemory
et de ce que je comprends les SoftReference
images Bitmap devrait être effacé lorsque l'application est à court de mémoire en arrêtant l'exception OutOfMemory
levée.
Qu'est-ce que je fais mal ici?
Ah mon mauvais ... ne le savais pas du tout. Est-ce que je peux faire quelque chose pour l'empêcher? Je suis complètement coincé. – mlevit
Il est parfaitement logique d'attraper OutOfMemoryError, si on a un moyen de résoudre le problème, ou si l'on veut dire à l'utilisateur, par exemple, de démarrer une nouvelle activité dans un processus séparé. – arberg