这两款加载库分别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);
}
});
}