预先捕获Android列表图像的最佳做法是什么?

时间:2016-04-21 09:17:14

标签: android caching picasso android-image

目前我正在加载图像,即使用户没有滚动查看,所以当他将从列表承包商的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 - 添加静态布尔值以确保此方法只调用一次,如果在服务器端添加了图像,这对于在滚动时加载的少量图像来说并不是什么大问题,因为它们必须已经在缓存中。

2 个答案:

答案 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的软参考保留在内存中,并在FragmentActivity与{{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);
}

FileInternet的图片加载为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等)。