Приложение, содержащее галерею с изображениями из sd карт, вылетает, onOrientation изменено - PullRequest
1 голос
/ 03 декабря 2010

У меня есть следующий пользовательский адаптер для виджета Галерея.все прекрасно работает, за исключением случаев, когда я меняю ориентацию экрана, приложение вылетает из-за

 12-03 12:45:48.897: ERROR/AndroidRuntime(3594): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

Я знаю, что максимальный бюджет виртуальной машины составляет 16 МБ.но как я прошел это?Есть ли способ очистить память, которая не используется или при изменении ориентации?я знаю, что есть метод рециркуляции для растровых изображений, но как мне использовать его в моем случае?

public class ImageAdapter extends BaseAdapter {

int mGalleryItemBackground;
private Context mContext;
private Uri[] mUrls;
String[] mFiles=null;

public ImageAdapter(Context c) {

    mContext = c;
    readImagesFromSd();
    TypedArray a = c.obtainStyledAttributes(R.styleable.Gallery1);
    mGalleryItemBackground = a.getResourceId(
        R.styleable.Gallery1_android_galleryItemBackground, 0);
    a.recycle();  
}

public void readImagesFromSd(){
    File images = new File(Environment.getExternalStorageDirectory().toString()+CameraView.FOLDER+"/"); 
    images.mkdirs();
    File[] imagelist = images.listFiles();
    //Toast.makeText(mContext, String.valueOf(imagelist.length), Toast.LENGTH_LONG).show();

    /*new FilenameFilter() {

        @Override
        public boolean accept(File dir, String name) {
            return ((name.endsWith(".jpg")) || (name.endsWith(".png")));
        }
    });*/
    mFiles = new String[imagelist.length];
    for (int i = 0; i < imagelist.length; i++) {
        mFiles[i] = imagelist[i].getAbsolutePath();
    }

    mUrls = new Uri[mFiles.length];

    for (int i = 0; i < mFiles.length; i++) {
        mUrls[i] = Uri.parse(mFiles[i]);
    }
}
public int getCount() {
   // return mImageIds.length;
    return mUrls.length;
}

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

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

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView i = new ImageView(mContext);
   // i.setImageResource(mImageIds[position]);
    i.setImageURI(mUrls[position]);
    i.setLayoutParams(new Gallery.LayoutParams(150, 100));
    i.setScaleType(ImageView.ScaleType.FIT_XY);
    i.setBackgroundResource(mGalleryItemBackground);

    return i;
}

}

...