Picasso - 自定义RequestHandler不会将图像缓存在磁盘上

时间:2015-04-08 10:22:44

标签: java android image caching picasso

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

我的问题是图像没有缓存在磁盘上。没有通常的文件夹/数据/数据/ 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);

2 个答案:

答案 0 :(得分:3)

正如@sashabelonogov所提到的,你需要将你的picasso实例与请求处理程序作为singeltone实例。我只是将它添加到我的Application类并在任何地方使用[2.0, 4.0] 来完成它。

Picasso.with(Context)

答案 1 :(得分:1)

你不应该宣布一些毕加索的例子。如果要使用自定义Picasso实例,请将其设置为Singleton。它对我有用。祝你好运!

另一条建议: 使用Downloader类(OkHttpDownloader.java或其他一些)代替downloadFullFromUrl()方法可能会更舒服。