Android学習-画像非同期ロードツールクラスはSoftReferenceを使用
出所とネット、具体的な住所は忘れて、ブログを書いて記録して、自分で後で使うのに便利です.原作者に感謝します.
呼び出された場所はこう書くことができます
参考までに、誤り訂正を歓迎します.
public class AsyncImageLoader {
public Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();
//
private ExecutorService executorService = Executors.newFixedThreadPool(5);
private final Handler handler = new Handler();
/**
*
* @param imageUrl url
* @param callback
* @return , null
*/
public Drawable loadDrawable(final String imageUrl,
final ImageCallback callback) {
//
if (imageCache.containsKey(imageUrl)) {
SoftReference<Drawable> softReference = imageCache.get(imageUrl);
if (softReference.get() != null) {
return softReference.get();
}
}
// , ,
executorService.submit(new Runnable() {
public void run() {
try {
final Drawable drawable = loadImageFromUrl(imageUrl);
imageCache.put(imageUrl, new SoftReference<Drawable>(
drawable));
System.out.println(Thread.currentThread().getId());
handler.post(new Runnable() {
public void run() {
callback.imageLoaded(drawable);
callback.returnImageLoaded(drawable);
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
return null;
}
//
protected Drawable loadImageFromUrl(String imageUrl) {
try {
// , ,
//SystemClock.sleep(2000);
return Drawable.createFromStream(new URL(imageUrl).openStream(),
"image.png");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//
public interface ImageCallback {
//
public void imageLoaded(Drawable imageDrawable);
public Drawable returnImageLoaded(Drawable imageDrawable);
}
}
呼び出された場所はこう書くことができます
private AsyncImageLoader asyncImageLoader3 = new AsyncImageLoader();
// , , ,
private Drawable loadImage4(final String url, final ImageView imageView) {
System.out.println("url" + url);
// ,ImageCallback
Drawable cacheImage = asyncImageLoader3.loadDrawable(url,
new AsyncImageLoader.ImageCallback() {
// : url
@Override
public void imageLoaded(Drawable imageDrawable) {
imageView.setImageDrawable(imageDrawable);
//cacheImage = imageDrawable;
}
@Override
public Drawable returnImageLoaded(Drawable imageDrawable) {
// TODO Auto-generated method stub
return imageDrawable;
}
});
if (cacheImage != null) {
imageView.setImageDrawable(cacheImage);
}
return cacheImage;
}
参考までに、誤り訂正を歓迎します.