Google推荐的图片加载库Glide介绍

发布时间:2023-05-09 10:12:38

Fresco和我们今天的主角Glide。他们各有千秋,不能评价谁一定比谁好,只能说哪一个更适合你。

我的理解

让我谈谈我个人对这些图片加载库的理解。如果有错误,我希望给你一些建议。

Universal Image Loader:一个强大的图片加载库,包括各种配置,最古老,使用最广泛。

Picasso: Square生产,一定是精品。搭配OkHTTP更配!

Volley ImageLoader:谷歌官方制作,可惜不能加载本地图片~

Fresco:Facebook,天生骄傲!一般不强。

Glide:Google推荐的图片加载库,专注于流畅滚动。

详见stackoverflow上的这个问题。

Glide初试

以下是今天的主题。相信很多同学之前都看过这篇介绍Glide的文章。文章,中文版在这里。本文从各个方面对Glide和Picaso进行了介绍和比较。总的来说,两者非常相似,API的使用风格几乎相同。但Glide在缓存策略和加载GIF方面略胜一筹。最后,作者强烈推荐了这个数据库。

而且据说Glide的踪迹在Google的新Photos应用中随处可见。看到这里,你是不是迫不及待地想试试这个库?就在你下定决心尝试一记的时候,你听说Yelp app(据说是美国的大众点评)也在使用这个挂炸天的库。你心里很激动,发四一定要用这个库。说干就干,打开Android Studio,builde.加入gradle

compile 'com.github.bumptech.glide:glide:3.6.1'

然后全局搜索图片加载的地方,都换成了以下代码:

Glide.with(mContext)        .load(url)        .placeholder(R.drawable.loading_spinner)        .crossFade()        .into(myImageView);

经过漫长的编译过程,再次打开APP,看到有渐现效果的图片呈现在你面前,你不禁喊道:“wocao,真正的TM帅!为什么我以前没发现?”。

但使用几天后,你会发现一些问题:

为什么 有些图片第一次加载时只显示占位图,第二次显示正常图片?

为什么 我总会得到类似Youu的东西 cannot start a load for a destroyed activity这样的异常呢?

为什么 我不能给加载的图片settag()?

为什么?为什么?这么多NB库会有这么多问题。是的,这是我今天要讲的重点。如何避免上述问题?

一些解决方案

1.如果你只是使用这个圆形Imageview库或其他自定义的圆形Imageview,而你只是设置了一个位置,那么你就会遇到第一个问题。如何解决它?

方案一: 不设置占位; 方案二:使用Glidetransformation 自定义圆形Bitmap的API转换。这是一个现有的例子; 方案三:用以下代码加载图片:

Glide.with(mContext)    .load(url)     .placeholder(R.drawable.loading_spinner)    .into(new SimpleTarget<Bitmap>(width, height) {        @Override         public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {            // setImageBitmap(bitmap) on CircleImageView         }     };

2.至于第二个问题,请记住一句话:不要在非主线程中使用Glide加载图片。如果真的使用,请用GetaplicationContext代替context参数。有关更多细节,请参考此issue。

3.为什么不能设置标签,因为你用错了姿势。如何为Imageview设置标签?听我仔细说。

方案一:使用setttagag:使用setttaga(int,object)方法设置标签,具体用法如下:

Java代码为酱紫:

Glide.with(context).load(urls.get(i).getUrl()).fitCenter().into(imageViewHolder.image);        imageViewHolder.image.setTag(R.id.image_tag, i);        imageViewHolder.image.setOnClickListener(new View.OnClickListener() {            @Override                int position = (int) v.getTag(R.id.image_tag);                Toast.makeText(context, urls.get(position).getWho(), Toast.LENGTH_SHORT).show();            }        });

同时,在values文件夹下新建ids.xml,添加

<item name="image_tag" type="id"/>

大功告成!

方案二:Glide3.6.之后,新增了全局设置的方法。具体方法如下:

首先实现Glidemoudle接口,全局设置Viewtagett的tagidle接口:

public class MyGlideMoudle implements GlideModule{    @Override    public void applyOptions(Context context, GlideBuilder builder) {        ViewTarget.setTagId(R.id.glide_tag_id);    }    @Override    public void registerComponents(Context context, Glide glide) {    }}

同样,ids也需要.在xml下添加id

<item name="glide_tag_id" type="id"/>

最后,AndroidManifest.添加到xml文件中

<meta-data    android:name="com.yourpackagename.MyGlideMoudle"    android:value="GlideModule" />

∩_∩)′。

方案三:写一个继承自Imageviewtaget的类别,复制其get/setrequest方法。

Glide.with(context).load(urls.get(i).getUrl()).fitCenter().into(new ImageViewTarget<GlideDrawable>(imageViewHolder.image) {            @Override            protected void setResource(GlideDrawable resource) {                imageViewHolder.image.setImageDrawable(resource);            }            @Override            public void setRequest(Request request) {                imageViewHolder.image.setTag(i);                imageViewHolder.image.setTag(R.id.glide_tag_id,request);            }            @Override            public Request getRequest() {                return (Request) imageViewHolder.image.getTag(R.id.glide_tag_id);            }        });        imageViewHolder.image.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                int position = (int) v.getTag();                Toast.makeText(context, urls.get(position).getWho(), Toast.LENGTH_SHORT).show();            }        });
一些使用技巧

1.Glide.with(context).resumeRequests()和 Glide.with(context).pauseRequests()

当列表滑动时,调用pauserequests()取消请求。当滑动停止时,调用resumerequests()恢复请求。这会更好吗?p>

2.Glide.clear()

这种方法可以帮助你清除所有图片加载请求。

3.ListPreloader

如果要预加载列表,不妨试试ListPreloader。

上一篇 Java 内存分配全面浅析
下一篇 断点调试

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题