You're on the right track, but I couldn't tell where in your code you account for view recycling in your List/GridView. You are indeed reusing the convertView passed to getView, but launching a new AsyncTask in every getView will lead to the tasks loading the images, but then inserting them in the wrong list rows if the view it was started by gets recycled. My advice would be to check out Volley, Google's new networking library. It has a NetworkImageView class that will load an image asynchronously into an ImageView. The reason I recommend it is caching, both on disk and in memory, and view recycling are handled for you.
Volley: https://developers.google.com/events/io/sessions/325304728
If you do want to tackle this on your own, I would check out the Android Developer blog post about loading bitmaps in a ListView. It demonstrated using AsyncTasks like you want to do, but it correctly handles view recycling.
Article: http://developer.android.com/training/displaying-bitmaps/process-bitmap.html
Last little tip: don't instantiate a new HttpClient for every network call. Creating one takes some time and the preferred method is to keep one HttpClient, configured for multi threading, as a Singleton instance and use it for your network calls. Alternatively, you could create a new HttpUrlConnection for each request; that is okay for that class.
EDIT: Sorry, I just realized I didn't actually answer the question. To implement an LruCache for Bimaps, you can extend the LruCache class from the Support Library with a few adjustments. Here's a class I've used for caching Bitamps for use with the Volley library:
// From com.android.volley.toolbox.ImageLoader
public interface ImageCache {
public Bitmap getBitmap(String url);
public void putBitmap(String url, Bitmap bitmap);
}
// My ImageCache implementation
public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageCache {
private static final int DEFAULT_CACHE_SIZE = (int) (Runtime.getRuntime().maxMemory() / 1024) / 8;
public BitmapLruCache() {
this(DEFAULT_CACHE_SIZE);
}
public BitmapLruCache(int maxSize) {
super(maxSize);
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value == null ? 0 : value.getRowBytes() * value.getHeight() / 1024;
}
}