I'm currently downloading a bunch of thumbnails in memory as a bitmap, resizing the bitmap via Bitmap.createScaledBitmap, and then using the resized bitMap to populate a BitmapDrawable, which I subsequently load into an ImageView to display.
As you can imagine, with a couple of dozen images this can be quite slow. Does anyone have any suggestions on how I can speed this up? I've tried resizing the Drawable via .setBounds, but that doesn't seem to work.
edit I am loading the bitmap into a drawable because at some future point I wish to utilize layers to add some text overlays to the image prior to display
Related
I am really trying to figure out which is the best way of loading a huge image in Android ImageView( or some other view extending ImageView).
I am aware of OOM issues with Android framework when working with bitmaps but still I need to implement the following requests:
horizontal scrollable imageview
must load a huge 8000px (keeping original image quality so no downsample) width and device height png image from drawble-nodpi in it and to be fluent while scrolling it without preloads or lag(recyclerview will have blinks so it is a no go I tried that)
I am thinking at a customview extending imageview and something to decode only current scrolled region from that bitmap but I am stuck here
avoid oom
also does a pdf viewer library be better than using huge png from performance point of view? I need the picture preloaded on app start not lazy loaded
I know that ,according to android docs, that if you have a big image. Then you scale it down to size of the image view you are loading it to (using the decodeResources and Options class).
Now my question is, lets say you want to load background picture and the source image is of similar size, do you just load the image? Or do you actually scale it down a bit and then using the FITXY to stretch it?
I am trying to avoid Out Of Memory exceptions here
Thank you
I mean, that the TextViews loads almost at once, however the ImageViews loads a bit slower, and this looks very ugly, and disturbing.
What can I do against it?
I load the images of the ImageView on the fly, and set the images of the ImageViews with setImageBitmap() in a background process.
setImageBitmap is time-consuming - it requires loading bitmap data from storage, memory allocation, decoding, etc, etc. A TextView obviously needs to do no such thing.
You can improve the situation somewhat by using placeholder images of the same size as the image that you're about to load, using transition animations, or (whenever possible) using resource drawables.
For my application I need to load a bitmap which sometimes can be really large. I'm getting OutOfMemory errors even on devices like galaxy S2. I searched around and found that I need to recycle the bitmap.
Previously I was loading the bitmap with BitmapFactory, creating a new scaled bitmap, and creating a bitmapdrawable all in one line. By doing this am I loading two bitmaps into memory? Should I create the initial bitmap and then recycle it after creating the scaled bitmap?
If the activity will be launched frequently should I load the bitmap once to a static field or should I recycle and recreate every time?
Thanks
Split the process into multiple steps. If you are measuring the bitmap against the available screen space and then loading a scaled bitmap, you can do the first step without loading the bitmap into memory using BitmapFactory.Options.inJustDecodeBounds. This will give you a Bitmap object without the pixel data but with the width and height properties. Then use that to decode your scaled bitmap using BitmapFactory.Options.inSampleSize.
Google these terms and you'll find tons of sample code doing just this. And yes, don't forget to recycle when you're done with a Bitmap.
https://www.google.com/#q=BitmapFactory+Options+inJustDecodeBounds+inSampleSize
i was wondering if is it efficient and possible to set 3000X2000px image as canvas background without resizing it and without getting the memory error.
because i want the real size image and pan around it.
using webview is not an option.
Currenty i tried to the set the background by using a folder structure named "Drawable-nodpi" and then assinging the bitmap image with decoderesource method.
Such a huge picture will inevitably cause outofmem exceptions on at least some devices. So I think that you need to dynamically scale and load only parts of the image that needs to be displayed, possibly with a caching mechanism.
Unfortunately, I don't know about any library components for Android that does this for you out of the box, but I'm pretty sure that you can find some nice articles on this topic.