【问题标题】:Picasso - Custom RequestHandler doesn't cache images on diskPicasso - 自定义 RequestHandler 不在磁盘上缓存图像
【发布时间】:2015-06-13 06:07:29
【问题描述】:

我需要从某些服务加载和缓存图像。在示例中没有这样的服务,但它显示了我想要实现的目标。

我的问题是图像没有缓存在磁盘上。没有通常的文件夹 /data/data/myapp/cache/picasso-cache。

如何从 RequestHandler 访问缓存。甚至有可能,或者写自定义下载器会更好?

RequestHandler

public class CustomRequestHandler extends RequestHandler {

    private static final List<String> PATHS = Arrays.asList("http://somelink/someimage1.png",
            "http://somelink/someimage2.png",
            "http://somelink/someimage3.png");

    private Iterator<String> pathIterator = PATHS.iterator();

    @Override
    public boolean canHandleRequest(Request data) {
        return data.uri.toString().contains("custom");
    }

    @Override
    public Result load(Request request, int networkPolicy) throws IOException {
        if (!pathIterator.hasNext()) {
            pathIterator = PATHS.iterator();
        }

        Bitmap bitmap = downloadFullFromUrl(pathIterator.next());
        Result result = new Result(bitmap, Picasso.LoadedFrom.NETWORK);
        return result;
    }

    private static Bitmap downloadFullFromUrl(String imageFullURL) {
        Bitmap bm = null;
        try {
            URL url = new URL(imageFullURL);
            URLConnection ucon = url.openConnection();
            InputStream is = ucon.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            ByteArrayBuffer baf = new ByteArrayBuffer(50);
            int current;
            while ((current = bis.read()) != -1) {
                baf.append((byte) current);
            }
            bm = BitmapFactory.decodeByteArray(baf.toByteArray(), 0,
                    baf.toByteArray().length);
        } catch (IOException e) {
            Log.d("ImageManager", "Error: " + e);
        }
        return bm;
    }
}

用法:

Picasso picasso = Picasso.Builder(application)
                .addRequestHandler(requestHandler)
                .build();

picasso.load("custom").into(imageView);

【问题讨论】:

    标签: java android image caching picasso


    【解决方案1】:

    正如@sashabelonogov 提到的,您需要将带有请求处理程序的 picasso 实例作为单音实例。我只是通过将它添加到我的 Application 类并在任何地方使用 Picasso.with(Context) 来做到这一点。

    public class MyApplication extends Application {
    
        public void onCreate() {
            super.onCreate();
            Picasso picasso = new Picasso.Builder(getApplicationContext())
                    .addRequestHandler(new MyRequestHandler())
                    .build();
            Picasso.setSingletonInstance(picasso);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您不应该声明几个毕加索的实例。如果要使用自定义 Picasso 实例,请将其设为 Singleton。它对我有用。祝你好运!

      另一个建议: 使用 Downloader 类(OkHttpDownloader.java 或其他类)而不是 downloadFullFromUrl() 方法可能更舒服。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-01
        • 2016-06-25
        • 2015-05-16
        • 2013-09-07
        • 2016-06-18
        • 2014-06-16
        • 2014-07-21
        • 1970-01-01
        相关资源
        最近更新 更多