IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Out of memory sur un Widget Gallery


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Par défaut Out of memory sur un Widget Gallery
    Bonjour

    Je suis en train de tester un Widget Gallery. Le programme fonctionne correctement si j'utilise les ressources de type Draw mais il annonce un out Of Memory quand je lis les photos prises par le device sur la SdCard. Les deux première photos s'affichent puis quand je fais glisser ca explose.

    Voici le code de la classe de test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    public class TestGallery extends Activity {
     
    	private int[] IMG;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            Cursor imgCursor = managedQuery
    		(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    		                                new String[]{android.provider.MediaStore.Images.Media._ID},
    		                                null, null,
    		null); 
     
    		imgCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,null, null,null); 
     
     
     
    		int nbrCol = imgCursor.getColumnCount();
    		Log.i("Test","nbrCol = " + String.valueOf(nbrCol));
     
     
    		int Pos = 0;
    		imgCursor.moveToFirst();
    		//while(!imgCursor.isAfterLast()){
    		ArrayList<String> arrayImage = new ArrayList<String>();
    		for (int Cpt = 0; Cpt < 65; Cpt++){
        		String nom = imgCursor.getString(1);
        		if (nom.contains("Perso")){
        			arrayImage.add(imgCursor.getString(0));
        			Log.i("Test","ID = " + imgCursor.getString(0) + " nom = " + nom + " size = " + imgCursor.getString(2));
        		}
     
     
        		imgCursor.moveToNext();
    		}
     
    		int nbrPhoto = arrayImage.size();
    		Log.i("Test","nbrPhoto = " + String.valueOf(nbrPhoto));
    		IMG = new int[nbrPhoto];
    		for (int Cpt = 0; Cpt < nbrPhoto; Cpt++){
    			IMG[Cpt] = Integer.parseInt(arrayImage.get(Cpt));
    		}
     
     
    		Gallery galleryPhoto = (Gallery) findViewById(R.id.Gallery01);
    		ImageAdapter imageAdapter = new ImageAdapter(this, IMG);
    		galleryPhoto.setAdapter(imageAdapter);
        }
    }
    Voici le code de la classe ImageAdpater

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    public class ImageAdapter extends BaseAdapter{
     
    	int galleryBkgd;
        private Context context;
        private int[]images;
     
        public ImageAdapter(Context cont, int[] img) {
            context = cont;
            images = img;
            TypedArray  typedArray = context.obtainStyledAttributes(R.styleable.Gallery);
            galleryBkgd = typedArray.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0);
            typedArray.recycle();
        }
     
    	@Override
    	public int getCount() {
    		// TODO Auto-generated method stub
    		return images.length;
    	}
     
    	@Override
    	public Object getItem(int position) {
    		// TODO Auto-generated method stub
    		return position;
    	}
     
    	@Override
    	public long getItemId(int position) {
    		// TODO Auto-generated method stub
    		return position;
    	}
     
    	@Override
    	public View getView(int position, View view, ViewGroup parent) {
    		// TODO Auto-generated method stub
     
    		ImageView imageView = new ImageView(context);
    		//imageView.setImageResource(images[position]);
    		imageView.setImageURI(Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,String.valueOf(position)));    
     
     
    		imageView.setBackgroundResource(galleryBkgd);
    		return imageView;
    	}
     
    }

    Et enfin le message d'injures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:451)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:322)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:688)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.ImageView.resolveUri(ImageView.java:557)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.ImageView.setImageURI(ImageView.java:289)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at com.android.testgallery.ImageAdapter.getView(ImageAdapter.java:51)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.Gallery.makeAndAddView(Gallery.java:754)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.Gallery.fillToGalleryRight(Gallery.java:703)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.Gallery.layout(Gallery.java:634)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.Gallery.onLayout(Gallery.java:339)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.view.View.layout(View.java:6578)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.LinearLayout.onLayout(LinearLayout.java:918)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.view.View.layout(View.java:6578)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.view.View.layout(View.java:6578)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.LinearLayout.onLayout(LinearLayout.java:918)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.view.View.layout(View.java:6578)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.view.View.layout(View.java:6578)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1056)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1774)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.os.Handler.dispatchMessage(Handler.java:99)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.os.Looper.loop(Looper.java:123)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at android.app.ActivityThread.main(ActivityThread.java:4321)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at java.lang.reflect.Method.invokeNative(Native Method)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at java.lang.reflect.Method.invoke(Method.java:521)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
    09-06 10:04:09.708: ERROR/AndroidRuntime(20338):     at dalvik.system.NativeStart.main(Native Method)
    Une idée ?

    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 60
    Par défaut
    C'est normal que ça finisse par exploser avec les photos de la sdCard, celles-ci étant beaucoup plus lourdes que des ressources de type draw. L'application garde en mémoire les premières images visualisées, ce qui fait qu'à un moment, c'est trop. C'est pour cette raison que lorsqu'on manipule des bitmap il est conseillé de faire des "recycle" le plus souvent possible.

    Déjà, pour commencer, je te conseillerai de travailler avec des bitmaps, en utilisant la méthode setImageBitmap d'ImageView. Ensuite, de deux choses l'une : ou bien tu manipules tes bitmaps pour qu'ils pèsent moins lourds (redimensionnement, baisse de quality), ou t'essaies de placer des bitmap.recycle, même si je dois admettre que je vois pas trop où.

    En espérant que ça a pu t'aider

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Par défaut
    Bravo pour l'idée. Effectivement il a fallu que je retravaille le code dans ce sens là pour y arriver

    Pour ceux que cela intéresse, voici le code du programme de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    public class TestGallery extends Activity {
     
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            Cursor imgCursor = managedQuery
    		(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new String[]{android.provider.MediaStore.Images.Media._ID},null, null,null); 
    		imgCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,null, null,null); 
     
    		int nbrCol = imgCursor.getColumnCount();
    		Log.i("Test","nbrCol = " + String.valueOf(nbrCol));
     
    		imgCursor.moveToFirst();
    		ArrayList<String> arrayPath = new ArrayList<String>();
    		for (int Cpt = 0; Cpt < 65; Cpt++){
        		String nom = imgCursor.getString(1);
        		if (nom.contains("Perso")){
        			arrayPath.add(imgCursor.getString(1));
        			Log.i("Test","ID = " + imgCursor.getString(0) + " nom = " + nom + " size = " + imgCursor.getString(2));
        		}
        		imgCursor.moveToNext();
    		}
    		ArrayList<BitmapDrawable> arrayListBmp = new ArrayList<BitmapDrawable>();
    		for (int Cpt = 0; Cpt < arrayPath.size(); Cpt++){
    			BitmapFactory.Options options = new BitmapFactory.Options();
    			options.inSampleSize = 8;
    			Bitmap bitmapOrg = BitmapFactory.decodeFile(arrayPath.get(Cpt), options);
    			int width = bitmapOrg.getWidth();
    			int height = bitmapOrg.getHeight();
    			int newWidth = 50;
    			int newHeight = 50;
    			float scaleWidth = ((float) newWidth) / width;
    			float scaleHeight = ((float) newHeight) / height;
    			Matrix matrix = new Matrix();
    			matrix.postScale(scaleWidth, scaleHeight);
     
    			Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0,width, height, matrix, true);
    			BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);
    			arrayListBmp.add(bmd);
    		}
     
    		Gallery galleryPhoto = (Gallery) findViewById(R.id.Gallery01);
    		ImageAdapter imageAdapter = new ImageAdapter(this, arrayListBmp);
    		galleryPhoto.setAdapter(imageAdapter);
     
        }
    }
    et voici le code la classe ImageAdapter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    public class ImageAdapter extends BaseAdapter{
     
    	int galleryBkgd;
        private Context context;
        ArrayList<BitmapDrawable> images;
     
        public ImageAdapter(Context cont, ArrayList<BitmapDrawable> arrayListBmp) {
            context = cont;
            images = arrayListBmp;
            TypedArray  typedArray = context.obtainStyledAttributes(R.styleable.Gallery);
            galleryBkgd = typedArray.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0);
            typedArray.recycle();
        }
     
    	@Override
    	public int getCount() {
    		// TODO Auto-generated method stub
    		return images.size();
    	}
     
    	@Override
    	public Object getItem(int position) {
    		// TODO Auto-generated method stub
    		return position;
    	}
     
    	@Override
    	public long getItemId(int position) {
    		// TODO Auto-generated method stub
    		return position;
    	}
     
    	@Override
    	public View getView(int position, View view, ViewGroup parent) {
    		// TODO Auto-generated method stub
    		ImageView imageView = new ImageView(context);
    		imageView.setImageDrawable(images.get(position));
    		imageView.setBackgroundResource(galleryBkgd);
     
    		return imageView;
    	}
     
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 21/03/2013, 13h32
  2. Gros problème "out of memory" sur un site web
    Par petton dans le forum Développement Web avec .NET
    Réponses: 4
    Dernier message: 18/05/2011, 18h41
  3. Out of memory sur une requête
    Par guismo45 dans le forum Administration
    Réponses: 12
    Dernier message: 24/12/2008, 18h22
  4. Erreur "Out Of Memory" sur application en VB4
    Par aokiseiichiro dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 18/07/2007, 17h37
  5. Out of memory sur un appel de smtpsend
    Par frangin2003 dans le forum Modules
    Réponses: 1
    Dernier message: 01/06/2006, 14h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo