使用Picasso缓存预加载构建应用程序

时间:2015-11-10 16:30:20

标签: android picasso

我想知道是否有任何方法可以轻松地将Picasso的预先缓存的图像文件夹捆绑在一个应用程序中。

我的理由是使用一些基本信息填充应用程序,即使用户第一次打开应用程序时没有/有限的互联网连接也可以访问。

可以使用cache/picasso-cache检索$ adb pull /data/data/com.package.name/ .文件夹,但与Realm(https://realm.io/docs/objc/latest/#bundling-a-realm-with-an-app)不同,似乎没有办法让Picasso意识到它。

可能相关:Using Picasso with custom disk cache

1 个答案:

答案 0 :(得分:0)

虽然只使用预先制作的缓存非常容易,但我对此有了第二个想法:

  1. 从模拟器中提取的缓存相当大。

  2. 在我的用例中,只有在没有互联网可用时才向用户显示一些缩略图就足够了。它可能要小得多。

  3. 我的解决方案是:

    1. 将所有重要图像导入您的绘图。
    2. 尝试使用Picasso获取网络可用/当前缓存的图像。
    3. 如果此提取返回错误,则使用本地可用的drawable填充ImageView(使用Picasso!)
    4. 我陷入了陷阱:

      1. 使用Picasso .placeholder(R.drawable.id)无法正常工作,因为它会在加载目标图像之前使用占位符,可能是为了节省资源/内存
      2. 使用Picasso .error(R.drawable.id)几乎可以正常工作,但毕加索不能像对异步加载的图像一样转换placeholdererror图像。这意味着.fit().centerInside()和其他转换不会工作。 (见https://github.com/square/picasso/issues/337
      3. 加载可变资源名称对我来说至关重要。这发生在getThumbnail()上。我将所有图片命名为product_thumbnail_{DB_ID}

        private int getThumbnail(Integer id)
        {
            Resources res = context.getResources();
            int resID = res.getIdentifier("product_thumbnail_"+ id, "drawable", context.getPackageName());
            return resID;
        }
        

        我的适配器内的主要逻辑:

        final Context context = viewHolder.itemView.getContext();
        final ImageView imageHolder = viewHolder.productImageHolder;
        final int thumbnail = getThumbnail(product.getId());
        
        if(thumbnail != 0)
        {
            Picasso.with(context)
                    .load(product.getImageUrl())
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .fit()
                    .centerInside()
                    .into(imageHolder, new com.squareup.picasso.Callback() {
                        @Override
                        public void onSuccess() { }
        
                        @Override
                        public void onError() {
                            useThumbnail(thumbnail, imageHolder, context);
                        }
                    });
        }
        else
        {
            Picasso.with(viewHolder.itemView.getContext())
                    .load(product.getImageUrl())
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .fit()
                    .centerInside()
                    .into(imageHolder);
        }
        

        useThumbnail():

        private void useThumbnail(int thumb, ImageView imageHolder, Context context)
        {
            Picasso.with(context)
                    .load(thumb)
                    .networkPolicy(NetworkPolicy.NO_CACHE)
                    .fit()
                    .centerInside()
                    .into(imageHolder);
        }