Glide 使用 override(Target.SIZE_ORIGINAL) 部分机型出现的异常

Glide 在使用 .override(Target.SIZE_ORIGINAL) 时候, 部分机型(尤其是很不OK的小米) 出现内存过大导致的运行时异常 :

new RequestOptions()
 .centerCrop()
 .dontAnimate()
 .skipMemoryCache(false)
 .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
 .override(Target.SIZE_ORIGINAL);

异常:

java.lang.RuntimeException: Canvas: trying to draw too large(108576768bytes) bitmap.
...

简单解决,给的一个确切的大小 :

override(ResUtils.getDimensionPixelSize(R.dimen.dp_200), ResUtils.getDimensionPixelSize(R.dimen.dp_300));

🌴 然鹅显示效果并不好... 需要进行宽高的重新测量才能获得更好的宽高:

1.配置
public static RequestOptions getRequestOptions() {
    return new RequestOptions()
            //注意: 对应的 ImageView 的裁切类型必须一致!!!
            .centerCrop()
            .dontAnimate()
            //使用透明图占位图, 无缝过渡效果更佳!!!
            .placeholder(R.mipmap.ic_glide_placeholder)
            .error(R.mipmap.ic_glide_placeholder)
            .skipMemoryCache(false)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .override(ResUtils.getDimensionPixelSize(R.dimen.dp_180), ResUtils.getDimensionPixelSize(R.dimen.dp_260));
    //小米会出现 内存过大导致的运行时异常
    //.override(Target.SIZE_ORIGINAL)
    //改为:
    //.override(ResUtils.getDimensionPixelSize(R.dimen.dp_200), ResUtils.getDimensionPixelSize(R.dimen.dp_280));
}

2.加载方式:
Glide.with(imageView.context)
    .load(url)
    .apply(Global.getRequestOptions())
    .transition(DrawableTransitionOptions.withCrossFade())
    .into(object : CustomTarget<Drawable>() {
        override fun onLoadCleared(placeholder: Drawable?) {
        }
        override fun onResourceReady(
            resource: Drawable,
            transition: Transition<in Drawable>?
        ) {
            val imgWidth = resource.intrinsicWidth
            val imgHeight = resource.intrinsicHeight
            val realHeight =
                Utils.getScreenWidth(Library.get().context) * imgHeight / imgWidth
            val layoutParams = imageView.layoutParams
            if (layoutParams != null) {
                layoutParams.height = realHeight
                imageView.layoutParams = layoutParams
            }
            Glide.with(imageView.context).load(url).into(imageView)
        }
    })
posted @ 2020-05-10 16:29  javakam  阅读(0)  评论(0)    收藏  举报  来源