I think enumerateAll() is a problem here.  If you use enumerate() you'll be able to get the first songs on the screen faster, and there won't be as much apparent lag.  Note, however, that you probably shouldn't just use enumerate() and pass the songs one at a time to update() because that would cause a lot of flicker.    It might be best to batch songs in groups of 10 or something...

Also, my guess about the OOM is that all these calls to ListView.update() cause a lot of calls to createListElement, which cause calls to displayAlbumArt().  Because displayAlbumArt is async, we end up with hundreds of concurrent calls to getThumbnailURL().  That seems like it would eat up a lot of memory!

My hope is that using enumerate() instead of enumerateAll() will just make this problem go away.