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

Android 在apk文件中添加预缓存图像,以便与毕加索或类似库一起使用,android,caching,picasso,Android,Caching,Picasso,我正在使用毕加索在我的Android应用程序中检索和显示图像。为了避免通过网络下载所有图像,我尝试使用apk文件添加一些图像,作为一组预缓存的图像。这些图像存储在资产文件夹中,然后在安装时复制到毕加索缓存文件夹。这正如预期的那样,但毕加索仍然通过网络下载所有图像,并将其缓存为.0和.1文件,如下所示: root@generic_x86:/data/data/com.my.app/files/images_cache # ls 10.JPG 100.JPG 101.JPG 102.JPG 11.J

我正在使用毕加索在我的Android应用程序中检索和显示图像。为了避免通过网络下载所有图像,我尝试使用apk文件添加一些图像,作为一组预缓存的图像。这些图像存储在资产文件夹中,然后在安装时复制到毕加索缓存文件夹。这正如预期的那样,但毕加索仍然通过网络下载所有图像,并将其缓存为
.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
图像是我复制的,其他是毕加索缓存的图像。有没有办法让毕加索在安装时正确缓存这些图像

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

更新:尝试从资产文件夹缓存 我试着制作一个小片段,在应用程序第一次运行时运行。其思想是迭代给定资产文件夹中的文件,并使用毕加索获取这些图像。然而,下面的代码没有缓存任何内容,尽管我最终使用了回调的
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;
}

您可以使用文件URI请求毕加索从您的资产位置(而不是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);

当它下载任何图像时,它会记住这个散列并从中生成一个用于缓存的密钥。是的,我想我可以找到散列并对所有图像进行散列,或者创建一个临时的
ImageView
,然后将每个图像加载到此中,以迫使毕加索缓存图像,但这更像是一种黑客行为。因此,我想知道是否有任何内置的解决方案。你可以改进这个黑客只是获取他们,它没有必要将他们添加到图像视图。嗯,我尝试过这样做,见更新后的文章。然而,我想知道:即使我可以做到这一点,从资产目录中获取文件是否会使哈希与通过网络获取相同?我的意思是,从资产文件夹中,我使用
”file:///android_asset/my_images/my_file.JPG“
,但对于我使用的网络路径,
http://this/is/my/network/path/image.JPG
。不,密钥是基于您传递的URI生成的,这意味着如果您对资产文件夹中的同一映像进行n/w调用,您最终将从n/w获取图像。要克服这一点,你必须构建自己的MemoryCache并将其注入毕加索。可以使用Util.createKey()构建缓存。这意味着您必须同时拥有资产文件夹和n/w URI的缓存密钥。