在apk文件中添加预先缓存的图像,以便与Picasso或类似的库一起使用

时间:2015-11-26 16:28:45

标签: android caching picasso

我正在使用Picasso在我的Android应用中检索和显示图像。为了避免通过网络下载所有图像,我试图用apk文件添加一些图像,作为一组预先缓存的图像。这些图像存储在assets文件夹中,然后在安装时复制到Picasso缓存文件夹。这可以按预期工作,但毕加索仍然通过网络下载所有图像并将其缓存为.0.1这样的文件:

root@generic_x86:/data/data/com.my.app/files/images_cache #
ls
10.JPG
100.JPG
101.JPG
102.JPG
11.JPG
1f94664dec9a8c205b7dc50f8a6f3b79.0
1f94664dec9a8c205b7dc50f8a6f3b79.1
2.JPG
4621206beccad87a0fc01df2d080c644.0
4621206beccad87a0fc01df2d080c644.1

*.JPG图像是我复制的图像,其他图像是Picasso缓存图像。有没有办法让Picasso在安装时正确缓存这些图像?

如果没有,是否还有其他类似的库支持这种预缓存?

更新:尝试从Assets文件夹缓存

我尝试制作一个在应用程序首次运行时运行的小片段。我们的想法是迭代给定资产文件夹中的文件并使用Picasso获取这些图像。但是,下面的内容不会缓存任何内容,尽管我最终会使用回调的onSuccess()方法。资产文件名是正确的。这也通过使用错误的文件夹名称进行验证,这使我处于回调的onError()方法中。

我也尝试将其加载到临时ImageView中,但它确实有所不同。

public static boolean cacheImagesFromAssetsFolder(Context context)
{
    boolean ok = false;

    try
    {
        String[] images = context.getAssets().list("my_images");
        for (String image : images)
        {
            Picasso.with(context).load("file:///android_asset/my_images/" + image).fetch(new Callback()
            {
                @Override
                public void onSuccess()
                {
                    // This is where I end up. Success, but nothing happens.
                }

                @Override
                public void onError()
                {

                }
            });
        }
        ok = true;
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    return ok;
}

1 个答案:

答案 0 :(得分:0)

您可以使用文件URI请求Picasso从您的资产位置而不是n / w中选择图像。

  Picasso.with(activity) //
                .load(Uri.fromFile(file)) // Location of the image from asset folder

更新:如何使用自己的缓存

import com.squareup.picasso.LruCache;
import com.squareup.picasso.Util;
LruCache imageCache = new LruCache(context);
Request request = Request.Builder(Uri.fromFile(asset_file), 0, null).build();
String cacheKey = Util.createKey(request, new StringBuilder());
imageCache.set(cacheKey, bitmap_object_of_asset_image);
Picasso.Builder(context)
       .memoryCache(imageCache)
       .build().load(asset_url).fetch(callback);