首先,不从任何源码角度分析分析这两个框架,因为,我也没有看过源码。只是从实际使用的过程中来把这两个加载图片的框架来做个简单对比。有很多方法也许解释有错误的地方,望大家指正。
Picasso 加载图片:
项目中加载的是本地图片。在用Picasso加载过程中 ImageView的控件大小是1920*1080 如果图片的分辨远远大于这个值的时候Picasso就加载不出来。加载出来的是一个白屏的界面。很丑。
Picasso.with(this).load("file://"+playPath).error(R.mipmap.h_default).memoryPolicy(MemoryPolicy.NO_CACHE).noPlaceholder().into(img_three);
Picasso加载图片 相信大家都很熟悉了。加载本地图片的时候用MemoryPolicy.NO_CACHE这个属性,不进行缓存 .noPlaceholder()这个属性说明在加载过程中不需要占位图而是在切换下一张图的时候继续保持上一张图。
也可用 .placeholder(img_three.getDrawable()) 继续用上一张的图片作为占位图。和.noPlaceholder()方法的效果一样 。
加载图片的时候 默认是有一个渐变的动画的。如果不想要的话可以用 .noFade() 取消这个渐变效果。不过还是有这个渐变效果比较好看一点。不至于加载图片的时候,显的那么突兀。
Glide 加载图片:
因为项目中用的这个图片,有可能是gif动态图,就考虑用picasso不能满足需求了 上网查到Glide这个框架可以加载gif动态图
就用了Glide加载
Glide.with(this).load("file://" + playPath).diskCacheStrategy(DiskCacheStrategy.NONE).
dontAnimate().placeholder(img_one.getDrawable()).error(R.mipmap.h_default).into(img_one);
Glide加载和picasso和相似的就是 glide加载图片的时候 如果这个activity被销毁了。这时候会报错。
java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
这个错 我是这么解决的。用一个boolean 值 当activity被finish掉的时候。就把这个booliean值置位false.加载图片的这句代码前面加上这一句判断。当 stopThread为ture是才去加载图片。这样就不会报这个错了。
Glide也是默认带淡入淡出的动画的 但是频繁的切换图片的时候。图片总是一闪一闪的。如果图片质量很大的话。加载的时候会有一个黑色的等待很难看。
dontAnimate().placeholder(img_one.getDrawable())
加上这句就可以去掉一闪一闪的效果。但是用上面这一句加载的时候,图片的动画效果也没有了。我后来把.dontAnimate()这个方法去掉了。想着就会有动画了。结果动画是有了。但是图片切换一会就报错了
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@8095a04
at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1270)
at android.graphics.Canvas.drawBitmap(Canvas.java:1404)
at com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable.draw(GlideBitmapDrawable.java:101)
at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:198)
at android.graphics.drawable.TransitionDrawable.draw(TransitionDrawable.java:208)
at android.widget.ImageView.onDraw(ImageView.java:1226)at android.view.View.draw(View.java:16178)
at android.view.View.updateDisplayListIfDirty(View.java:15174)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.draw(View.java:16181)
at android.view.View.updateDisplayListIfDirty(View.java:15174)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.updateDisplayListIfDirty(View.java:15169)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.updateDisplayListIfDirty(View.java:15169)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.draw(View.java:16181)
at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690)
at android.view.View.updateDisplayListIfDirty(View.java:15174)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067)
不知道为什么会报这个错 。点进去是bitmap 调用recycle()方法释放资源的时候爆出了错。
我也一直没有解决。就把动画效果砍掉了。现在加载起来。图片切换时候很突兀。但是也没有办法。
总结: 各有所长吧。要是两个结合一下就好了
Picasso 加载的时候有淡入淡出的动画效果。但是不能加载分辨率很大的图片。不能加载动态的gif图片。
Glide 加载图片的时候 可以加载大图片。可以加载gif图片。就是没有了动画效果。那个错至今还没解决。有谁要是解决了。请告之我是怎么解决的。万分感谢。