7
votes

Android SetImageuri hors de mémoire

J'ai une très petite activité qui doit montrer une image.

Si la photo n'est pas très petite (par exemple 1.12 MB 2560x1920), elle produit une mémoire sur l'orientation de l'écran de changement. J'ai essayé getdrawable.setCallback (null) mais pas de chance. P>

où suis-je faux? P>

public class Fullscreen extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    System.gc();
    setContentView(R.layout.fullscreen);
    ImageView imageView = (ImageView) findViewById(R.id.full_screen_image);
    long imageId = 2;
    imageView.setImageURI(Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + imageId));
    }
}


0 commentaires

4 Réponses :


4
votes

consommer moins de mémoire et de descente / redimension (voir la documentation de bitmapoptions # insélistance) l'image.


0 commentaires

1
votes

Votre application doit être contextuelle. C'est généralement la raison pour laquelle l'application se bloque après plusieurs changements d'orientation. Lisez ceci soigneusement http://android-developers.blogspot.com /2009/01/avoiding-Memory-leaks.html .


0 commentaires

11
votes

Essayez d'ajouter ceci à votre méthode OnDestroy:

ImageView imageView = (ImageView) findViewById(R.id.full_screen_image);
BitmapDrawable bd = (BitmapDrawable)imageView.getDrawable();
bd.getBitmap().recycle();
imageView.setImageBitmap(null);


4 commentaires

Super message mais vous pouvez ajouter un obligatoire si! = null vérifier pour bd :)


Il n'est pas nécessaire que vous soyez toujours digues dans votre ONCREATE;)


Le recyclage semble une méthode très ancienne. Est-ce nécessaire sur Android 4.0?


Ron & Gingo, merci. Et c'est mieux si la vérification nulle est incluse. De plus, lors de votre retour d'une autre activité, la vue d'image doit généralement appeler SetImageBitMap (NULL) et DrotHDrawingCache () pour afficher la nouvelle image.



1
votes

Vous pouvez également utiliser quelque chose comme ceci:

        File picture = new File("path_to_image");
        if (picture.exists()) {
            ImageView imageView = (ImageView)findViewById(R.id.imageView);
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 2;
            Bitmap myBitmap = BitmapFactory.decodeFile(picture.getAbsolutePath(), options);
            imageView.setImageBitmap(myBitmap);
        }


0 commentaires