用Picasso的RequestHandler进行自定义加载的方法

本文详细介绍了如何通过继承Picasso的RequestHandler类来自定义图片加载方式,包括通过Bitmap加载视频缩略图和通过流加载加密图片。文章提供了具体的实现代码和使用方法,并解释了如何配置这些自定义加载方式。此外,还介绍了另一种通过流加载的技术,适用于加密图片的场景。最后,文章总结了这些加载方式的应用场景和优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用Picasso加载图片只有URL和URI两种方式,通过path或file都是转成URI再进行加载的。其实还有一种自定义加载的方式,即去继承RequestHandler,就可以通过流或者Bitmap就行加载了。

通过Bitmap加载是因为要加载视频缩略图。

public class VideoRequestHandler extends RequestHandler {

    public String SCHEME_VIDEO = "video";

    @Override
    public boolean canHandleRequest(Request data) {
        String scheme = data.uri.getScheme();
        return (SCHEME_VIDEO.equals(scheme));
    }

    @Override
    public synchronized Result load(Request data, int arg1) throws IOException {
        Bitmap bm = ThumbnailUtils.createVideoThumbnail(data.uri.getPath(), MediaStore.Images.Thumbnails.MINI_KIND);
        return new Result(bm, Picasso.LoadedFrom.DISK);
    }
}

这里继承RequestHandler类,canHandleRequest()返回的是否要使用这种加载方法,通过uri的头是否是这里定义的SCHEME_VIDEO进行判断。load方法,通过
ThumbnailUtils.createVideoThumbnail方法获取到bitmap,返回返回其组成的Result。

使用也很简单。先配置进picasso对象:

 videoRequestHandler = new VideoRequestHandler();
        mPicasso = new Picasso.Builder(getApplicationContext())
                .listener(new Picasso.Listener() {
                    @Override
                    public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
                        String s = "";
                        s.length();
                    }
                })
                .addRequestHandler(videoRequestHandler)
                .build();
load时uri加上这个自定义的头就行了:

   mPicasso.load(videoRequestHandler.SCHEME_VIDEO + ":" + videoPath).
                    resize(mImageSize, mImageSize).
                    placeholder(R.drawable.pic_load).
                    error(R.drawable.video_fail).
                    centerCrop().
                    into(holder.mImageView, callback);

再介绍一个通过流加载的,这里是因为把图片进行了加密,直接加载不出来,解析文件出来再加载就太麻烦了,只能通过先解析出流,直接加载流图片。

public class FilexRequestHandler extends RequestHandler {

    public static final String SCHEMA_FILEX = "filexm";
    private static final int PREFIX_LENGTH = SCHEMA_FILEX.length() + 3; // filexm://

    @Override
    public boolean canHandleRequest(Request data) {
        return SCHEMA_FILEX.equals(data.uri.getScheme()) &&
                !data.uri.getPathSegments().isEmpty();
    }

    @Override
    public Result load(Request request, int networkPolicy) throws IOException {
        String filepath = request.uri.toString().substring(PREFIX_LENGTH);
        File file = new File(filepath);
        InputStream inputStream = FilexHelper.decodeStream(new FileInputStream(file), file.length());
        return new Result(inputStream, DISK);
    }

}

Requesthandler也是一样,通过一个前缀判断,load时先把前缀去掉了,再解析出解密的流,再返回流组成的Result就行了。

使用方法也是先加配置,不过这里用的是PicassoPlus:

PicassoPlus.addRequestHandler(new FilexRequestHandler());
加载方法:
PicassoPlus.with(EditImagesActivity.this).
                            load(FilexHelper.genFilxLoadUri(file)).
                            resize(size, size).
                            placeholder(R.drawable.pic_load).
                            error(R.drawable.pic_fail).
                            centerCrop().
                            into(holder.mImageView);

除了改成PicassoPlus,其它和普通加载都是一样的,就是uri不一样:

    /**
     * 获取picasso加载的uri
     * @param file
     * @return
     */
    public static String genFilxLoadUri(File file) {
        return "filexm://" + file.getAbsolutePath();
    }
还是一个头加加一个路径。

这种加载方式还是挺不错的,不过一般很少碰到这样的需求,挺难用到的。这次我居然用到了两个,真是麻烦的项目。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值