How to overcome from OutOfMemoryError in android - android

Each and everytime I use swipe option to swipe b/w Images I always get OutOfMemoryError. Either I am using ViewPager or ActivitySwipeDetector every time this error occured. I am using android:largeHeap="true" its work on API level 11 and above. But what to do if we are using minimum API level 8. And what guidelines we have to follow for elminating this error and working with lots of bitmaps?

Here are a few suggestions to avoid OOM in ViewPager.
If the bitmap sizes for the image views in your view pager are very big, then dynamically resize the bitmap based on the screen size.
Call bitmap.recycle() in the destroyItem method of view pager adapter to free up memory (ginger bread devices). If you have not implemented destroyItem correctly, then it could lead to memory issues.
Set setOffscreenPageLimit to a small value (say 2) to minimize the number of bitmaps.

Related

Managing Memory for showing large bitmaps in android

I know this question is asked several times, but still clarity to my situation would be helpful.
I am showing some images in 2 column grid view. When user taps on an image, I am displaying the image in ViewPager. The Image which is displayed in gridview is about 200X200px and I want to show the same image with enlarged size say about 800X800px in ViewPager in a DialogFragment.
The Actual size of images are huge with different resolutions. I have followed the link http://developer.android.com/training/displaying-bitmaps/index.html and I have scaled down images to size which is required for my app. In ViewPager fragment dialog I am also recycling the image with bitmap.recycle() and calling System.gc() explicitly(I know this is a bad practice) at PagerFragment onDestroy. But even then I am getting Out of memory error. On top of it, I am encountering this issue only in Android 4.2.1 (Nexus 7) but not on Android 4.1.2( Samsung Tab) and Android 4.4(Nexus 7).
For later 2 android versions, I do not have to call even System.gc(). It works very well without this. I have checked Viewpager with some 300 - 400 images. But for former after scrolling 60 images, App is crashing with OutOfmemory error. To resolve this I have used a workaround for now android:largeHeap="true" which I think is very bad for myapp and could not digest it.
I really appreciate if anyone who can help me avoid android:largeHeap="true".
In my app, I have to show around 6000 images in GridView and also an enlarged image in ViewPager linked to GridView. I am loading only 20 images from FileSystem asynchronously while scrolling gridview.
Thanks in advance...
Use an LRUCache to hold the images. Make that the only thing that holds a Bitmap that's not currently on screen. That way the older bitmaps will be kicked out and garbage collected quickly.

ViewPager - ImageView OutOfMemory

My app is getting crashed (throws OutOfMemoryError) when I try to load images in a ViewPager. Here are the details.
All the images are 720*1280 in dimension with 100-150KB in size.
I even tried using Fragments in a Viewpager to load images.. but after sliding one or two images the app gets crashed.
Any pointers on how to resolve this?
Thanks!!
720*1280*32 = 29491200 bits = 3.52 mb each one in memory.
Checkout this tutorial :)
Out of memory error means exactly what is stays. The application is trying to allocate to much memory. Android application are (depending on device) allowed to allocate 30-50MB.
The problem with the view pager is that it tries to hold at least 3 pages (current previous and next) to provide fluent UI work.
Bitmap to be displayed needs to uncompressed. So the only thing that matters is the size (pixel number) and color depth.
Usually 3 bitmaps of size you given should be quite easy hold on the device. I suppose that you are trying to process them in some not proper way, or you are missing releasing them from memory. Can't say more not knowing what are you doing with those bitmaps.

Android Viewpager OutOfMemoryError Fragment

where each page is a fragment with a different image set as a background. Since i need to ensure it scrolls smoothly without lag, i have set the offscreenpage to 20(the number of items in the viewpager)but i am getting this error quite oftenly:
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
i have already compressed the images to the maximum(Compressed JPEGS),any idea how i can solve this issue?
There is a nice article in the Training section of the Android developers site: http://developer.android.com/training/displaying-bitmaps/index.html... it shows you how to use caching mechanisms in you android applications. You can adopt this in your ViewPager implementation.
I would load/unload the background images dynamically as you switch fragments. They should load fast enough to not notice, especially if you use an animation to hide the transition (fade in/fade out). Or better yet, load 4 or 5 of them (2 in each direction) so you only see the fading if you scroll very quickly.
The bitmap size depends on the pixel density of the image. Try to reduce your background image MPx.

android Bitmap caching for ViewPager issue

I have a ViewPager with ImageView as child views. The ImageView displays Bitmap loaded from network and/or cached to local cache implemented as LruCache based class (from Android support library). The problem is that when the images are removed from LruCache, the GC seems to not release or release too late the bitmap memory. I very often get the exception OutOfMemory while loading new bitmap from network/disk even if the old bitmaps are removed from LruCache and from the holding ImageViews of ViewPager (I removed views from ViewPager). I read that sometimes (?) you must call the Bitmap.recycle (prior to Android 3.0) but this does not work. It also does not work on ICS (I do not call Bitmap.recycle there).
How to solve this problem?
The garbage collector won't recycle your bitmap if something is still referencing it. I would imagine that you have ImageViews hanging onto your bitmaps. ViewPager doesn't recycle Views so you'll need to clear out your ImageView when it's not being shown.
You can check out the BitmapFun sample from android developers site on how to display Bitmaps efficiently. The sample has a GridView and ViewPager of images already that you can refer to in building your app. Though the sample has some caching issue which I did some work around already. You can check it out here.
The problem isn't handling many images, it's that your images aren't getting deallocated when your activity is destroyed.
It's difficult to say why this is without looking at your code. However, this article has some tips that might help:
http://blog.booking.com/android-reuse-bitmaps.html

Android gallery of drawables

I'm creating a simple Gallery of drawables - each of them is almost the size of a screen, so they require quite much memory. For each entry I'm creating a custom LinearLayout with ImageView and TextView for the title. As most of you know, android Gallery doesn't recycle views so it gallery will crash easily on low-memory phones (after loading 4 drawables on 16mb ram limit, in my case).
Here's the simple question - how do you implement such gallery, so it won't run out of the memory? How do you recycle these images? A working code example would be great.
Few notes:
inSampleSize isn't a way to go, I can't scale these images down
Calling recycle() on Drawable's loaded from resource is impossible, as it will crash on Android 4.0+ (it will recycle the drawable in their internal cache)
Don't ask me to post the code, as there is no.
You shouldn't be using Gallery because it's deprecated. Especially since there isn't any code written so far. The documentation suggests using a HorizontalScrollView or ViewPager.
I feel a ViewPager is what your looking for because it will only keep at most 3 pictures in memory and handels all the recycling for you. Here is a post with more information about how to implement one android viewPager implementation

Categories

Resources