OutOfMemory Error using ImageView

后端 未结 2 2073
挽巷
挽巷 2021-01-07 15:00

i\'m trying to make a wallpaper set app using ImageView. I know its hard to display a bunch of images (especially when images are 1920x1080), what i did was to make other bu

相关标签:
2条回答
  • 2021-01-07 15:43

    Move the images to a new folder called "drawable-nodpi".

    Reason

    Images in different drawable folders are opened by the android system with different memory allocations, hdpi means it will take a LOT of memory even if the image is tiny.

    drawable-nodpi is the best for memory saving.

    0 讨论(0)
  • 2021-01-07 15:43

    To fix OutOfMemory you should do something like that:

    BitmapFactory.Options options=new BitmapFactory.Options();
    options.inSampleSize = 8;
    Bitmap preview_bitmap=BitmapFactory.decodeStream(is,null,options);
    

    This inSampleSize option reduces memory consumption.

    Here's a complete method. First it reads image size without decoding the content itself. Then it finds the best inSampleSize value, it should be a power of 2. And finally the image is decoded.

    //decodes image and scales it to reduce memory consumption
    private Bitmap decodeFile(File f){
    try {
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);
    
        //The new size we want to scale to
        final int REQUIRED_SIZE=70;
    
        //Find the correct scale value. It should be the power of 2.
        int scale=1;
        while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale/2>=REQUIRED_SIZE)
            scale*=2;
    
        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {}
    return null;
    }
    
    0 讨论(0)
提交回复
热议问题