我在Listadapter的getView上从缓存加载图像时遇到了很大的问题。 对于图像加载,我们正在使用Picasso,在那里我构建了一个用于从缓存加载图像的构造,如果没有可用的图像,那么图像应该从在线URI加载。
(这是一个方法,在我的适配器的getView
内部调用)
@Override
protected void loadImages(final VehicleResultListItem inCurrentItem) {
// Try to load async the images from local path
Picasso.with(mContext)
.load(new File(mContext.getExternalFilesDir(null),
inCurrentItem.getVehicleId()))
.placeholder(inCurrentItem.getServiceType().getPlaceholderId())
.noFade()
.into(new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap,
final Picasso.LoadedFrom from) {
mThumbnailImgView.setImageBitmap(bitmap);
}
@Override
public void onBitmapFailed(final Drawable errorDrawable) {
// If the local-path-loading fails, try to grab the images online.
Picasso.with(mContext)
.load(inCurrentItem.getImageURIs().get(0).getImageUriSizeM())
.placeholder(inCurrentItem.getServiceType().getPlaceholderId())
.into(new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap,
final Picasso.LoadedFrom from) {
// On succesfully online-loading of the images, store and show them
mThumbnailImgView.setImageBitmap(bitmap);
saveToInternalSorage(bitmap, inCurrentItem);
}
@Override
public void onBitmapFailed(final Drawable errorDrawable) {
// NO interaction
}
@Override
public void onPrepareLoad(final Drawable placeHolderDrawable) {
// No interaction
}
});
}
@Override
public void onPrepareLoad(final Drawable placeHolderDrawable) {
mThumbnailImgView.setImageDrawable(placeHolderDrawable);
}
});
}
问题是,图像加载正确,但图像加载后imageView没有更新。在OnImageLoaded中,我不在UI-Thread中,所以它不会更新视图。所以我尝试了一切:
看起来线程变得混乱或类似的东西。
在Picasso-Target中调用Picasso可能有问题吗?
你有任何建议吗?Greetz和thx
答案 0 :(得分:3)
Target
不能是匿名类。 Picasso
会在Target
上保留一个WeakReference,该请求最有可能在请求完成时获得gc。
Javadoc清楚地说明了这一点。
改为使用View
工具Target
并将其用作目标或保留对目标实例的引用。
此外Picasso
会自动为您处理磁盘缓存,除非您已将资产随应用程序一起提供,我建议您只需下载它们,然后让Picasso
管理磁盘/内存缓存对你而言。