Here is a code-snippet. I may not compile, but i think you'll get the
idea :-)
[code]
ExecutorService EXECUTOR = Executors.newFixedThreadPool(3); // max 3
worker threads.
...
public View getView(final AbsListView listView, View convertView, int
pos, long id) {
...
...
final String imgUrl = ...
...
final ImageView imgView = ...
...
Bitmap bm = mBitmapCache.get(imgUrl);
if (bm != null)
imgView.setImageBitmap(bm);
else {
imgView.setTag(imgUrl);
FutureTask<?> task = EXECUTOR.submit(new Runnable() {
public void run() {
final Bitmap newBM = getImageFrom(imgUrl); // you have to
write this method
if (newBM == null)
return;
// be sure that mBitmapCache is thread-safe.
mBitmapCache.put(imgUrl, newBM);
// instead of 'listView', you could use a new Handler
instance.
listView.post(new Runnable() {
public void run() {
String checkUrl = (String)imgView.getTag();
if (checkUrl != null && !checkUrl.equals(imgUrl))
return;
imgView.setImageBitmap(newBM);
}
});
}
private Bitmap getImageFrom(String url) {
// download the data from imgUrl.
// create a bitmap from it.
return bitMap;
}
});
}
// if you want, you can hold on to 'task' and call 'cancel' on it if
necessary, e.g.
// when this convertView is about to be re-used and to be assigned
to a different image.
return convertView;
}
[/code]
On Mar 24, 10:13 am, Streets Of Boston <[email protected]>
wrote:
> I've done the same in my apps for ListView (whether they be in
> ListActivity or in a plain Activity) with good success.
>
> I use the java.util.concurrent's ExecutorService to obtain images:
>
> 1. Your getView(..) (or bindView/newView/etc) needs to assign an image/
> thumbnail (bitmap) to an ImageView. But you don't have the bitmap yet.
> If you do have it (store in a limited size cache), just set it .
> 2. If not, obtain a FutureTask from the ExecutorService and this
> FutureTask then will download the image, create a thumbnail from it
> and creates a Bitmap from this thumbnail. Remember the id of the image
> (can be an id, Uri, URL, whatever, as long as it is unique) and assign
> it to the ImageView (setTag()).
> 3. When ready, the FutureTask will 'post' back to the main-thread that
> it has an new thumbnail.
> 4. On the 'post'-back, loop through the children of ListView, get the
> appropriate ImageView, the one whose tag (getTag()) is equal to the
> one that FutureTask you got the image for, assign the Bitmap to this
> ImageView. This is it.
>
> For myself I created a sub-system of ExecutorService and FutureTask,
> called 'Cancelable' tasks, which make it easier to cancel queued up
> tasks when they're no longer necessary. But this is an optimization.
>
> On Mar 24, 8:06 am, Mark Murphy <[email protected]> wrote:
>
>
>
> > Ivan Soto wrote:
> > > Do you have any article/tutorial about the placeholder images to share?
> > > I'm trying to find one with no luck.
>
> > I have used the technique, but not in code I'm allowed to share. I do
> > need to more formally write this up at some point, but I do not have
> > anything immediately handy.
>
> > The gist of it is that you create your adapter and set it up, in
> > getView() or newView()/bindView() (depending on adapter choice), to see
> > if the thumbnail has been downloaded. If so, use it for the list row
> > being inflated/updated; if not, leave the ImageView in the row pointing
> > to some placeholder Drawable resource. This means as the user scrolls,
> > she will pick up the thumbnails. Also, at the end, you can quickly
> > iterate over the rows (ListView is a ViewGroup, IIRC, so there are
> > methods to iterate its children) and ensure each of those rows'
> > ImageViews are using their associated thumbnails.
>
> > --
> > Mark Murphy (a Commons Guy)http://commonsware.com
> > Android App Developer Books:http://commonsware.com/books.html- Hide quoted
> > text -
>
> - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---