For various Android applications, I need large ListView
s, i.e. such views with 100-300 entries.
All entries must be loaded in bulk when the application is started, as some sorting and processing is necessary and the application cannot know which items to display first, otherwise.
So far, I've been loading the images for all items in bulk as well, which are then saved in an ArrayList<CustomType>
together with the rest of the data for each entry.
But of course, this is not a good practice, as you're very likely to have an OutOfMemoryException
then: The references to all images in the ArrayList
prevent the garbage collector from working.
So the best solution is, obviously, to load only the text data in bulk whereas the images are then loaded as needed, right? The Google Play application does this, for example: You can see that images are loaded as you scroll to them, i.e. they are probably loaded in the adapter's getView()
method. But with Google Play, this is a different problem, anyway, as the images must be loaded from the Internet, which is not the case for me. My problem is not that loading the images takes too long, but storing them requires too much memory.
So what should I do with the images? Load in getView()
, when they are really needed? Would make scrolling sluggish. So calling an AsyncTask
then? Or just a normal Thread
? Parametrize it?
I could save the images that are already loaded into a HashMap<String,Bitmap>
, so that they don't need to be loaded again in getView()
. But if this is done, you have the memory problem again: The HashMap
stores references to all images, so in the end, you could have the OutOfMemoryException
again.
I know that there are already lots of questions here that discuss "Lazy loading" of images. But they mainly cover the problem of slow loading, not too much memory consumption.
Edit: I've now decided to start AsyncTasks in getView() which load the image into the ListView in the background. But this causes my application to run into an RejectedExecutionException. What should I do now?
See Question&Answers more detail:
os