2012-05-16 123 views
4

im在GridView中显示sd卡上的特定文件夹中的图像,直到知道所有工作正常所有图像都显示在gridview上,但是当我改变屏幕的方向时,它会崩溃。下面是我的代码和崩溃日志:在gridview中显示SD卡中的图像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; 
    } 






} 

我得到了内存不足的错误,下面是我的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

你所问问题之前试过吗?搜索在stackoverflow ... –

+0

在此之前,我这样做与BitmapFactory,但没有对我工作正常 –

+0

加载完整的图像与任何内存管理,你一定会得到OOM错误,请参阅本网站[http://developer.android.com /training/displaying-bitmaps/index.html](Load Bitmaps) – Herry

回答

4

将此添加到您的清单中用于列表视图活动

android:configChanges="orientation|keyboardHidden" 

如果这不是帮助再加入这段代码的图像文件采样位

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; 
     } 

负载很多很多的图像会导致应用程序耗尽内存和力closes.I认为这是什么发生在您的应用程序。内存问题是一个复杂的问题android开发应用程序。这可以通过手动清除未使用的位图和使用垃圾回收器来解决。

尝试使用System.gc();

尝试回收使用

Bitmap.recycle()位图;

使所有未使用的位图为空。

取消分配所有未使用的内存。

这一切都将帮助你很多,也通过这个link。使用内存分析它会帮助你发现了释放的内存>试试这个link

+0

否仍然崩溃 –

+0

我被编辑我的代码 –

+0

即时通讯面临相同我提到以上 –

1

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

在你的manifest.xml编辑您的活动标签并尝试

+0

好吧,让我试试这个 –

+0

对其不工作 –

+0

他正在运行内存不足的错误。此解决方案不起作用。他必须解决内存不足 –

相关问题