2012-05-16 2 views
4

Im Afficher les images d'un dossier spécifique sur la carte SD dans GridView jusqu'à ce que tout fonctionne correctement toutes les images sont affichées sur le gridview mais quand je change l'orientation de l'écran, il se bloque. ci-dessous est mon code et Crash Log:Afficher les images de la carte SD dans gridview android

import java.io.File; 

import android.content.Context; 
import android.net.Uri; 
import android.os.Environment; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 

     public class ImageAdapter extends BaseAdapter { 
     private Context mContext; 
     File root = new File(Environment.getExternalStorageDirectory() 
       + File.separator + "MYPICS" + File.separator); 
     private File[] fileName = root.listFiles(); 
     int count=fileName.length; 
     public ImageAdapter(Context c) { 
      mContext = c; 
     } 

     public int getCount() { 
     return fileName.length; 
    } 

    public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 

      Uri uri = Uri.fromFile(fileName[position]); 

     ImageView imageView; 
     if (convertView == null) { // if it's not recycled, initialize some attributes 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(8, 8, 8, 8); 
     } else { 
      imageView = (ImageView) convertView; 
     } 

     imageView.setImageURI(uri); 
     return imageView; 
    } 






} 

Je reçois la mémoire Out erreur, voici mon Logcat:

05-16 16:18:31.218: E/AndroidRuntime(26907): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:573) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:439) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.widget.ImageView.resolveUri(ImageView.java:521) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.widget.ImageView.setImageURI(ImageView.java:305) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at com.sachin.imagegrideview.ImageAdapter.getView(ImageAdapter.java:53) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.widget.AbsListView.obtainView(AbsListView.java:1464) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.widget.GridView.onMeasure(GridView.java:935) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.view.View.measure(View.java:8313) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.view.View.measure(View.java:8313) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.widget.LinearLayout.measureVertical(LinearLayout.java:531) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.view.View.measure(View.java:8313) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.view.View.measure(View.java:8313) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.view.ViewRoot.performTraversals(ViewRoot.java:845) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.view.ViewRoot.handleMessage(ViewRoot.java:1865) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.os.Looper.loop(Looper.java:130) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at android.app.ActivityThread.main(ActivityThread.java:3687) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at java.lang.reflect.Method.invokeNative(Native Method) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at java.lang.reflect.Method.invoke(Method.java:507) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
05-16 16:18:31.218: E/AndroidRuntime(26907): at dalvik.system.NativeStart.main(Native Method) 
+0

ce que vous avez essayé avant de poser la question? recherche dans stackoverflow ... –

+0

Avant cela, je le fais avec BitmapFactory mais rien ne fonctionne bien pour moi –

+0

Charger l'image complète avec n'importe quelle gestion de la mémoire, vous obtiendrez l'erreur OOM, s'il vous plaît référer ce site [http://developer.android.com /training/displaying-bitmaps/index.html](Charger les bitmaps) – Herry

Répondre

4

ajoutez cela à votre manifeste pour l'activité listview

android:configChanges="orientation|keyboardHidden" 

si cela ne permet d'ajouter ensuite ce morceau de code pour votre fichier image pour échantillonner le bitmap

private Bitmap decodeFile(File f){ 
      FileOutputStream os = null; 
      try { 
       //Decode image size 
       BitmapFactory.Options o = new BitmapFactory.Options(); 
       o.inJustDecodeBounds = true; 

       FileInputStream fis = new FileInputStream(f); 
       BitmapFactory.decodeStream(fis, null, o); 
       fis.close(); 

       int scale = 1; 
       if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) { 
        scale = (int)Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE/(double) Math.max(o.outHeight, o.outWidth))/Math.log(0.5))); 
       } 

       //Decode with inSampleSize 
       BitmapFactory.Options o2 = new BitmapFactory.Options(); 
       o2.inSampleSize = scale; 
       fis = new FileInputStream(f); 
       try { 

       b = BitmapFactory.decodeStream(fis, null, o2); 

       } catch (OutOfMemoryError e) { 
        Log.d("hai","filename"+f); 
        System.gc(); 
       } 
       fis.close(); 
      } catch (IOException e) { 
      } 
      return b; 
     } 

lot charge de nombreuses images provoque l'application à court de closes.I de mémoire et de force pense que ce C'est ce qui arrive à votre application. Le problème de mémoire est un problème complexe Android lors du développement d'une application. Cela peut être résolu en effaçant manuellement les bitmaps inutilisés et en utilisant le garbage collector.

Essayez d'utiliser System.gc();

Essayez recyclage du bitmap en utilisant

Bitmap.recycle();

Rendre toute la bitmap inutilisée nulle.

Déplacez toute la mémoire inutilisée.

Tout cela vous aidera beaucoup et aussi passer par cet analyseur de mémoire link .Utilisation il vous aidera à repérer la mémoire DEALLOCATED> essayer cette link

+0

pas encore des accidents –

+0

je suis édité mon code –

+0

im face même que je mentionne ci-dessus –

1

<activity android:configChanges="keyboardHidden|orientation"></activity>

dans votre manifest.xml modifier votre tag d'activité et essayez

+0

ok laissez-moi essayer ce –

+0

sur son ne fonctionne pas –

+0

Il est en cours d'exécution dans l'erreur de mémoire insuffisante. Cette solution ne fonctionnera pas. Il doit travailler sur la résolution Hors de la mémoire –

Questions connexes