Android 面试(五):探索 Android 的 Handler,2024年最新android音视频开发面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

Android 面试(一):说说 Android 的四种启动模式
Android 面试(二):如何理解 Activity 的生命周期
Android 面试(三):用广播 BroadcastReceiver 更新 UI 界面真的好吗?
Android 面试(四):Android Service 你真的能应答自如了吗?

开始

Android 的消息机制,也就是 Handler 机制,相信各位都已经是烂熟于心了吧。即创建一个 Message 对象,然后借助 Handler 发送出去,之后在 HandlerhandleMessage() 方法中获取刚才发送的 Message 对象,然后在这里进行 UI 操作就不会出现崩溃了。

既然 Handler 操作都烂熟于心,还讲这个干什么?

嗯,对,在 Android 开发中,我们确实经常用到它,对于基本代码流程自然也是倒背如流,但了解它的原理的人却不是很多,所以面试官通常会考验你对 Handler 源码机制的理解,毕竟只有知己知彼,才能百战不殆嘛。

我们都知道 UI 操作只能在主线程进行,通常是怎么在子线程更新 UI 的?

  • Handler
  • Activity.runOnUiThread()
  • View.post(Runnable r)

讲讲 Handler 机制吧

Handler 主要由以下部分组成。

  • Handler
    Handler 是一个消息辅助类,主要负责向消息池发送各种消息事件Handler.sendMessage() 和处理相应的消息事件Handler.handleMessage()

  • Message
    Message 即消息,它能容纳任意数据,相当于一个信息载体。

  • MessageQueue
    MessageQueue 如其名,消息队列。它按时序将消息插入队列,最小的时间戳将被优先处理。

  • Looper
    Looper 负责从消息队列读取消息,然后分发给对应的 Handler 进行处理。它是一个死循环,不断地调用 MessageQueue.next() 去读取消息,在没有消息分发的时候会变成阻塞状态,在有消息可用时继续轮询。

在 Android 开发中使用 Handler 有什么需要注意的

首先自然是在工作线程中创建自己的消息队列必须要调用 Looper.prepare(),并且在一个线程中只能调用一次。当然,仅仅创建了 Looper 还不行,还必须使用 Looper.loop() 开启消息循环,要不然要 Looper 也没用。

我们平时在开发中不用调用是因为默认会调用主线程的 Looper。
此外,一个线程中只能有一个 Looper 对象和一个 MessageQueue 对象。

大概的标准写法是这样。

Looper.prepare();
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i(TAG, “在子线程中定义Handler,并接收到消息。。。”);
}
};
Looper.loop();

另外一个比较常考察的就是 Handler 可能引起的内存泄漏了。

Handler 可能引起的内存泄漏

我们经常会写这样的代码。

private final Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};

当你这样写的时候,你一定会收到编译器的黄色警告。

In Android, Handler classes should be static or leaks might occur, Messages enqueued on the application thread’s MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be retained as well. To avoid leaking the outer class, declare the Handler as a static nested class with a WeakReference to its outer class

在 Java 中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用,而静态的内部类不会持有外部类的引用。

要解决这样的问题,我们在继承 Handler 的时候,要么是放在单独的类文件中,要么直接使用静态内部类。当需要在静态内部类中调用外部的 Activity 的时候,我们可以直接采用弱引用进行处理,所以我们大概修改后的代码如下。

private static final class MyHandler extends Handler{
private final WeakReference mWeakReference;

public MyHandler(MainActivity activity){
mWeakReference = new WeakReference<>(activity);
}

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
MainActivity activity = mWeakReference.get();
if (activity != null){
// 开始写业务代码
}
}
}

private MyHandler mMyHandler = new MyHandler(this);

其实在我们实际开发中,不止一个地方可能会用到内部类,我们都需要在这样的情况下尽量使用静态内部类加弱引用的方式解决我们可能出现的内存泄漏问题。

最后

答应大伙的备战金三银四,大厂面试真题来啦!

这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析

资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

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

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

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

获取:vip204888 (备注Android)**
[外链图片转存中…(img-RZ16BUcw-1713691170128)]

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

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值