目前我正在加载图像,即使用户没有滚动查看,所以当他将从列表承包商的Picasso缓存加载图像时
private void createImageCatch(ArrayList<Article> items) {
for (int i = 0; i < items.size(); i++) {
Article article = (Article) items.get(i);
if (article.getImageUrl() != null
&& article.getImageUrl().length() > 0)
Picasso.with(mContext).load(article.getImageUrl())
.fetch();
}
}
这是完美的,即使用户快速滚动,图像也准备好了,但这是最好的方法吗?
IMPROVE UPDATE - 添加静态布尔值以确保此方法只调用一次,如果在服务器端添加了图像,这对于在滚动时加载的少量图像来说并不是什么大问题,因为它们必须已经在缓存中。
答案 0 :(得分:3)
您是否考虑过使用Volley library?它有一个特殊的ImageView
,可以为您下载和缓存图像。
用以下内容替换XML中的<com.android.volley.toolbox.NetworkImageView
android:id="@+id/photo"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentBottom="true"
android:layout_alignParentTop="true"
android:layout_marginRight="6dip"
/>
:
NetworkImageView photo = (NetworkImageView)view.findViewById(R.id.photo);
photo.setImageUrl("http://someurl.com/image.png", mImageLoader);
使用
加载图片ImageLoader
您需要设置private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
,因此请创建一些字段:
onCreate
并在mRequestQueue = Volley.newRequestQueue(context);
mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(10);
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
});
:
For c ... loop
来源:Setting up the Android Google Volley ImageLoader for NetworkImageView
答案 1 :(得分:1)
如果您想重复使用~30张小图片,可以将它们作为Bitmaps
的软参考保留在内存中,并在Fragment
或Activity
与{{1}离开后全部回收}}
例如,您的ListView
尺寸为55dp x 55dp,有30行图像。
<强> DISPLAYMANAGER 强>:
ImageView
您的活动或片段:
public static DP_55;//55 dp to px, do not count it each time, define it!
public static defineSize(Activity activity)
{
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
DP_55 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 55, metrics);
}
将File或Internet的图片加载为public HashMap<String, SoftReference<Bitmap>> bitmaps = new HashMap<>();
,缩放到您的尺寸(55 dp)并输入字典:
Bitmap
如何回收:
if (!bitmaps.containsKey(urlOrPath)) {
//Load 'bitmap' and put to dictionary:
bitmaps.put(urlOrPath, new SoftReference<>(
Bitmap.createScaledBitmap(
bitmap,
DisplayManager.DP_55, DisplayManager.DP_55, true)));
}
else //Just reuse it!
iv_image.setImageBitmap(bitmaps.get(urlOrPath).get());
您不会超出40MB的限制(如果Iterator<Map.Entry<String, SoftReference<Bitmap>>> iterator = bitmaps.entrySet().iterator();
while (iterator.hasNext()) {
iterator.next().getValue().get().recycle();
iterator.remove();
}
尺寸很小并且有<50行),并且在滚动最大速度后加载图像。
否则使用ImageLoaders(Glide,Picasso等)。