2013-07-11 4 views
0

J'ai un ImageView et j'ai besoin de getImageResource() basé sur la position GPS de l'utilisateur. Il y a 6 images et comme la distance entre 2 points diminue, je remplace l'image par une nouvelle ressource.Chargement ImageView causes OutOfMemory

Je teste l'application sur le Galaxy S4 et le problème est qu'après un très petit nombre aléatoire de chargement, l'application se bloque à cause de OutOfMemory.

Existe-t-il un bon moyen de mettre en cache les images? (Peut-être que je dois les charger en utilisant un AsyncTask)

Les images sont 400x400px png- 24 bits avec transparence.

Merci

+0

Quels dossiers drawable-x contiennent vos images? – Voicu

+0

J'ai tout placé dans le dossier mdpi juste pour l'instant. – Emanuele

Répondre

0

Galaxy S4 plus fonctionne probablement avec les xxhdpi dessinables, de sorte que vous mettre tout mdpi aura le système échelle vos images pour correspondre au niveau de ppp de S4 , d'où l'erreur OutOfMemory. Essayez de mettre à l'échelle et placer des tirages dans leurs dossiers respectifs en fonction de la dpi (y compris xhdpi et xxhdpi) et après cela peut-être optimiser votre code.

+0

J'ai essayé très rapidement et il semble que vous ayez raison. Le remplacement de l'image est plus lisse et le tas se développe plus lentement (la taille est réduite de moitié). Je vais essayer mieux demain. Merci pour maintenant. – Emanuele

1

Essayez d'utiliser ceci:

public static Bitmap decodeSampledBitmapFromResource(String uri, 
     int reqWidth, int reqHeight, int orientation) { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(uri, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, 
      reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    Bitmap decodeFile = BitmapFactory.decodeFile(uri, options); 
    int rotate = 0; 
    switch (orientation) { 
    case ExifInterface.ORIENTATION_ROTATE_270: 
     rotate = 270; 
     break; 
    case ExifInterface.ORIENTATION_ROTATE_180: 
     rotate = 180; 
     break; 
    case ExifInterface.ORIENTATION_ROTATE_90: 
     rotate = 90; 
     break; 
    } 
    Matrix matrix = new Matrix(); 

    // matrix.postScale(scaleWidth, scaleHeight); 
    matrix.postRotate(rotate); 

    Bitmap rotatedBitmap = Bitmap.createBitmap(decodeFile, 0, 0, 
      decodeFile.getWidth(), decodeFile.getHeight(), matrix, true); 

    return rotatedBitmap; 

} 

private static int calculateInSampleSize(BitmapFactory.Options options, 
     int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 
     if (width > height) { 
      inSampleSize = Math.round((float) height/(float) reqHeight); 
     } else { 
      inSampleSize = Math.round((float) width/(float) reqWidth); 
     } 
    } 
    return inSampleSize; 
}