最全Android Glide加载图片、网络监听、设置资源监听,b站招聘面试题

文末

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的相关的几十套腾讯、头条、阿里、美团等公司21年的面试专题,其中把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分免费分享给大家,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【延伸Android必备知识点】

这里只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢在关注一下~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

android:scaleType=“centerCrop” />

二、显示网络图片


这里我只是增加了一个图片控件,用于显示网络图片。

下面进入到MianActivity。

//网络图片URL

private String imgUrl = “http://cn.bing.com/th?id=OHR.LargestCave_ZH-CN2069899703_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp”;

//图片控件

private ImageView ivBg;

网络图片是使用必应的图片,然后在onCreate中进行配置显示。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//绑定id

ivBg = findViewById(R.id.iv_bg);

//显示图片

Glide.with(this).load(imgUrl).into(ivBg);

}

下面运行一下,你可以选择模拟器或者真机。

在这里插入图片描述

嗯,这就加载出来了,我相信你平常也是这么来使用Glide的。

三、添加设置资源监听


但如果你的图片很大,网络又不是很好的情况下,就会让用户有一种不好的体验,比如,当你在地铁站里浏览资讯时,此时网络环境很差,你加载图片没有反应,而用户也无法感知,此时就会认为你的软件有问题,所以你应该告诉用户当前的图片加载情况。

加载状态监听

private static final String TAG = “MainActivity”;

然后将

Glide.with(this).load(imgUrl).into(ivBg);

改成

//显示图片

Glide.with(this).load(imgUrl).into(new ImageViewTarget(ivBg) {

//图片开始加载

@Override

public void onLoadStarted(@Nullable Drawable placeholder) {

super.onLoadStarted(placeholder);

Log.d(TAG,“图片开始加载”);

}

@Override

public void onLoadFailed(@Nullable Drawable errorDrawable) {

super.onLoadFailed(errorDrawable);

Log.d(TAG,“图片加载失败”);

}

//图片加载完成

@Override

public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {

super.onResourceReady(resource, transition);

// 图片加载完成

ivBg.setImageDrawable(resource);

Log.d(TAG,“图片加载完成”);

}

@Override

protected void setResource(@Nullable Drawable resource) {

Log.d(TAG,“设置资源”);

}

});

这里使用了ImageViewTarget,它里面传入ImageView,这里默认是要你实现一个方法,那就是setResource,不过要是想实现这个状态的监听,则还需要实现onLoadStarted、onLoadFailed、onResourceReady这三个方法。现在我在上面打印了日志,下面重新运行一下,待图片加载出来之后,看一下日志。

在这里插入图片描述

这里可以看到,这是正常加载的情况,下面你可以把网络关掉,然后卸载刚才安装的应用,重新安装。

你会发现关闭网络之后图片确实没有加载出来,但是日志也没有看到有失败的字样。

这里你就要多重考虑一下了,因为加载网络图片实际上是分为两步的,第一步请求网络资源,第二步缓存资源显示出来,刚才把网络关闭了,那么我们就应该对网络请求增加监听才对。

四、添加设置资源监听


改动代码如下所示。

//显示图片

Glide.with(this)

.load(imgUrl)

.listener(new RequestListener() {

@Override

public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {

Log.d(TAG,“网络访问失败,请检查是否开始网络或者增加http的访问许可”);

return false;

}

@Override

public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {

Log.d(TAG,“网络访问成功,可以显示图片”);

return false;

}

})

.into(new ImageViewTarget(ivBg) {

//图片开始加载

@Override

public void onLoadStarted(@Nullable Drawable placeholder) {

super.onLoadStarted(placeholder);

Log.d(TAG, “图片开始加载”);

}

@Override

public void onLoadFailed(@Nullable Drawable errorDrawable) {

super.onLoadFailed(errorDrawable);

Log.d(TAG, “图片加载失败”);

}

//图片加载完成

@Override

public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {

super.onResourceReady(resource, transition);

// 图片加载完成

ivBg.setImageDrawable(resource);

Log.d(TAG, “图片加载完成”);

}

@Override

protected void setResource(@Nullable Drawable resource) {

Log.d(TAG, “设置资源”);

}

});

可以看到我又增加了一个listener,里面有对网络访问的返回,成功和失败,网络状态不好的情况下才会失败,像刚才我们没有开始网络就根本不会发起网络请求,自然不会有请求的返回。

下面开启网络,运行试一下。

在这里插入图片描述

这样你就完成了加载网络图片是网络状态的监听。

五、添加加载进度条


如果你还想加上一点变化的话可以这样,修改activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.android.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“.MainActivity”>

<ImageView

android:id=“@+id/iv_bg”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:background=“#000”

android:scaleType=“centerCrop” />

<ProgressBar

android:id=“@+id/progressBar”

android:visibility=“gone”

android:layout_centerInParent=“true”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

这里我修改了根布局为RelativeLayout ,然后加上了一个ProgressBar,它默认是隐藏的,下面回到MainActivity中。

//进度条

private ProgressBar progressBar;

然后在onCreate中

progressBar = findViewById(R.id.progressBar);

然后在图片设置资源时,开始时显示加载进度条,完成时隐藏进度条然后显示图片。

在这里插入图片描述

运行的效果就像下面这样。

在这里插入图片描述

当然这个加载速度取决于你的网速,快的话就是一闪而过。

现在你回头看这个Glide的加载,如果要同时满足网络加载和图片资源设置的监听,代码量就会比较多,如果我一个页面有多个地方要加载网络图片呢?我总不能写这么多重复的代码吧。因此我们可以写一个工具类来帮助我们做这一步。

六、封装工具类


新建一个GlideUtil类。

在里面写入如下代码。

/**

  • Glide工具类

  • @author llw

*/

public class GlideUtil {

//上下文

private static Context context;

public static void init(Context context) {

GlideUtil.context = context;

}

/**

  • 显示网络Url图片

  • @param url

  • @param imageView

*/

public static void loadImg(String url, ImageView imageView) {

Glide.with(context).load(url).into(imageView);

}

/**

  • 显示资源图片

  • @param recourseId 资源图片

  • @param imageView

*/

public static void loadImg(Integer recourseId, ImageView imageView) {

Glide.with(context).load(recourseId).into(imageView);

}

/**

  • 显示bitmap图片

  • @param bitmap

  • @param imageView

*/

public static void loadImg(Bitmap bitmap, ImageView imageView) {

Glide.with(context).load(bitmap).into(imageView);

}

/**

  • 显示drawable图片

  • @param drawable

  • @param imageView

*/

public static void loadImg(Drawable drawable, ImageView imageView) {

Glide.with(context).load(drawable).into(imageView);

}

}

目前这个代码很简单,通过init方法获取上下文,然后通过多参数方法来显示图片,当然这个可以根据实际需求来进行增减,这样写其实就减少了一步操作,可以在程序初始化的时候获取应用的上下文即可,你应该知道是什么了,没错就是Application,你如果不自己写则会使用默认的,但日常开发中都会自己自定义一个Application,在里面完成一些应用的初始化配置,比如数据库的创建,一个资源库的初始化。

下面新建一个MyApplication,然后集成Application,重写onCreate方法,在里面通过GildeUtil的init方法获取上下文。

/**

  • 自定义应用

  • @author llw

*/

public class MyApplication extends Application {

@Override

public void onCreate() {

super.onCreate();

GlideUtil.init(this);

}

}

然后你还需要到AndroidManifest.xml的application标签下进行配置,如下图所示:

在这里插入图片描述

下面你就可以使用这个工具类来加载图片了。

修改MainActivity中onCreate中的代码。

//显示图片

loadImg(imgUrl, ivBg);

在这里插入图片描述

然后你可以运行了,虽然这种封装方式并不是很高明,但是起码代码很简洁不是吗。它可以让你选择不同的图片资源类型,根据需求选择。

在这里插入图片描述

当然这只是普通的显示,如果我在知道网络请求的情况呢?

在GlideUtil中添加

private static final String TAG = “GlideUtil”;

//图片加载网络监听

private static RequestListener requestListener = new RequestListener() {

@Override

public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {

Log.d(TAG,“网络访问失败,请检查是否开始网络或者增加http的访问许可”);

return false;

}

@Override

public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {

Log.d(TAG,“网络访问成功,可以显示图片”);

return false;

}

};

然后增加一个方法。

/**

  • 显示网络Url图片 附带加载网络监听

  • @param url

  • @param imageView

*/

public static void loadImgListener(String url, ImageView imageView) {

Glide.with(context)

.load(url)

.listener(requestListener)

.into(imageView);

}

然后在MainActivity中修改代码。

在这里插入图片描述

下面运行一下,然后看日志是否有打印。

在这里插入图片描述

这样就可以了。那如果我也要知道这个设置图片资源的监听呢?依葫芦画瓢就行了。

在GlideUtil中增加一个方法。

/**

  • 获取ImageViewTarget

  • @param imageView

  • @return

*/

private static ImageViewTarget getImageViewTarget(final ImageView imageView) {

ImageViewTarget imageViewTarget = new ImageViewTarget(imageView) {

@Override

public void onLoadStarted(@Nullable Drawable placeholder) {

super.onLoadStarted(placeholder);

Log.d(TAG, “开始加载图片”);

}

@Override

public void onLoadFailed(@Nullable Drawable errorDrawable) {

super.onLoadFailed(errorDrawable);

Log.d(TAG, “加载图片失败”);

}

@Override

public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {

super.onResourceReady(resource, transition);

// 图片加载完成

imageView.setImageDrawable(resource);

Log.d(TAG, “加载图片完成”);

}

@Override

protected void setResource(@Nullable Drawable resource) {

}

};

return imageViewTarget;

}

然后修改loadImgListener方法。

在这里插入图片描述

再运行一下,看日志。

在这里插入图片描述

当然这种写法还是不够人性化,可能你只需要其中一个,或者都需要,或者都不需要,那如果要满足这个需求就还需要改动一下这个loadImgListener方法。

改动如下:

/**

  • 显示网络Url图片 附带加载网络监听和设置资源监听

  • @param url 网络图片url

  • @param imageView 图片控件

  • @param needNetListener 是否需要网络监听

  • @param needResourceListener 是否需要设置资源监听

*/

public static void loadImgListener(String url, ImageView imageView,

boolean needNetListener, boolean needResourceListener) {

if (needResourceListener) {

Glide.with(context)

.load(url)

.listener(needNetListener ? requestListener : null)

最后,如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ram imageView 图片控件

  • @param needNetListener 是否需要网络监听

  • @param needResourceListener 是否需要设置资源监听

*/

public static void loadImgListener(String url, ImageView imageView,

boolean needNetListener, boolean needResourceListener) {

if (needResourceListener) {

Glide.with(context)

.load(url)

.listener(needNetListener ? requestListener : null)

最后,如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值