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
原创粉丝点击