Android 两款不错的图片加载库使用详解
来源:互联网 发布:朗塞特 知乎 编辑:程序博客网 时间:2024/05/22 06:20
这两款加载库分别Picasso是Glide和。按需使用,优缺点不一。
导入库Picasso:
dependencies { compile 'com.squareup.picasso:picasso:2.5.1' }
导入库Glide:
Glide需要依赖Support Library v4,别忘了。
dependencies { compile 'com.github.bumptech.glide:glide:3.5.2' compile 'com.android.support:support-v4:22.0.0' }
Glide和Picasso非常相似,Glide加载图片的方法和Picasso如出一辙。
Picasso.with(context) .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg") .into(ivImg);
Glide.with(context) .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg") .into(ivImg);
虽然两者看起来一样,但是Glide更易用,因为Glide的with方法不光接受Context,还接受Activity 和 Fragment,Context会自动的从他们获取。同时将Activity/Fragment作为with()参数的好处是:图片加载会和Activity/Fragment的生命周期保持一致,比如Paused状态在暂停加载,在Resumed的时候又自动重新加载。所以我建议传参的时候传递Activity 和 Fragment给Glide,而不是Context。Glide默认的Bitmap格式是RGB_565 ,比ARGB_8888格式的内存开销要小一半。如果你觉得难以接受,可以创建一个新的GlideModule将Bitmap格式转换到ARGB_8888:
public class GlideConfiguration implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { // Apply options to the builder here. builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); } @Override public void registerComponents(Context context, Glide glide) { // register ModelLoaders here. } }
Picasso是加载了全尺寸的图片到内存,然后让GPU来实时重绘大小。而Glide加载的大小和ImageView的大小是一致的,因此更小。当然,Picasso也可以指定加载的图片大小的:
Picasso.with(this) .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg") .resize(768, 432) .into(ivImgPicasso);
但是问题在于你需要主动计算ImageView的大小,或者说你的ImageView大小是具体的值(而不是wrap_content),你也可以这样:
Picasso.with(this) .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg") .fit() .centerCrop() .into(ivImgPicasso);
Picasso和Glide在磁盘缓存策略上有很大的不同。Picasso缓存的是全尺寸的,而Glide缓存的是跟ImageView尺寸相同的。上面提到的平滑度的问题依然存在,而且如果加载的是RGB565图片,那么缓存中的图片也是RGB565。不过,你可以让Glide既缓存全尺寸又缓存其他尺寸:
Glide.with(this) .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg") .diskCacheStrategy(DiskCacheStrategy.ALL) .into(ivImgGlide);
Glide它远比Picasso快,但需要更大的空间来缓存。
还有一款图片加载库:fresco,这里就不过多介绍了。
在使用场景中,几款对比,Glide比其他几款更加好用,很少出现oom(其他几款在加载大图时,oom几率高很多),所以下面再扩展一下Glide:
//可以加载Gif,设置缓存模式等,很方便。Glide.with(mContext).load(item.getContent()).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).centerCrop().placeholder(R.mipmap.load).crossFade().into(giv);
下面附上自己写请求加载网络数据方式:
public byte[] loadByte(String u) throws Exception { URL url = new URL(u); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayOutputStream baos = new ByteArrayOutputStream(); final int BUFFER_SIZE = 2048; final int EOF = -1; int c; byte[] buf = new byte[BUFFER_SIZE]; while (true) { c = bis.read(buf); if (c == EOF) break; baos.write(buf, 0, c); } conn.disconnect(); is.close(); final byte[] data = baos.toByteArray(); baos.flush(); return data; }
xUtils框架网络加载图片方式:
ProgressDialog progressDialog; private void LoadImage() { RequestParams params = new RequestParams("http://s1.dwstatic.com/group1/M00/BA/7B/9a4e95bbd6b73c069af1b3349750f0db.gif"); params.setAsJsonContent(true); params.setBodyContent("json数据"); params.setAutoRename(true);//断点下载 //params.setSaveFilePath("/mnt/sdcard/demo.apk");//指定存储路径 x.http().get(params, new Callback.ProgressCallback<File>() { @Override public void onSuccess(File result) { progressDialog.dismiss(); try { //这里对File文件自行处理 } catch (IOException e) { e.printStackTrace(); } } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } @Override public void onWaiting() { } @Override public void onStarted() { } @Override public void onLoading(long total, long current, boolean isDownloading) { progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMessage("亲,努力下载中。。。"); progressDialog.show(); progressDialog.setMax((int) total); progressDialog.setProgress((int) current); } }); }
0 0
- Android 两款不错的图片加载库使用详解
- 【Android】异步加载图片-------不错的思路
- 两款 非常不错的Android 下拉刷新,上拉加载的框架
- android 一些图片加载库的使用
- Android Glide图片加载库的使用
- Android Glide图片加载库的使用
- Android Glide图片加载库的使用
- Android Glide图片加载库的使用
- android图片加载库的使用对比
- Android 图片加载库 Glide 的使用
- Android 平滑图片加载和缓存库 Glide 使用详解
- Android 平滑图片加载和缓存库 Glide 使用详解
- Android 平滑图片加载和缓存库 Glide 使用详解
- Android平滑图片加载和缓存库 Glide 使用详解
- Android 平滑图片加载和缓存库 Glide 使用详解
- Android 平滑图片加载和缓存库 Glide 使用详解
- Android 平滑图片加载和缓存库 Glide 使用详解
- Android 平滑图片加载和缓存库 Glide 使用详解
- Android序列化-Serializable和Parcelable
- https加密的实现
- socket编程中,阻塞与非阻塞的区别
- python操作MySQL时中文显示为?的解决方法
- SOCKADDR和SOCKADDR_IN的区别
- Android 两款不错的图片加载库使用详解
- 三墩IT人DevOps实践之持续集成
- 利用AWS免费账户搭建PPTP VPN
- 15个你不得不知道的Chrome dev tools的小技巧
- android 读取json字符串文件遇到的一个坑,记录下 W/art: Suspending all threads took: xx.xxx ms
- 集合的简单分类和区别
- 当Mybatis+sql遇到Expected one result (or null) to be returned by selectOne(), but found: 2时
- 3518E 问题集锦
- 为什么在Spring的配置文件里,最好不要配置xsd文件的版本号