开头

最近很多网友反馈:自己从各处弄来的资料,过于杂乱、零散、碎片化,看得时候觉得挺有用的,但过个半天,啥都记不起来了。其实,这就是缺少系统化学习的后果。

为了提高大家的学习效率,帮大家能快速掌握Android开发的各个知识点。为大家整理了一套系统的Android开发者进阶学习笔记

这套资料不仅包含**【Android开发者系统核心知识笔记】还有【2021最新大厂面试真题集锦】**,共计2983页PDF,58万字。无法全部展示

PS:这是一个高质量的Android交流圈子,群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农。群成员十分活跃,在这里,不仅能获得前辈们的职场经验和指点,你的技术问题老猿们也乐于解答。

一、Android性能优化的方面

针对Android的性能优化,主要有以下几个有效的优化方法:

1.布局优化

2.绘制优化

3.内存泄漏优化

4.响应速度优化

5.ListView/RecycleView及Bitmap优化

6.线程优化

7.其他性能优化的建议

下面我们具体来介绍关于以上这几个方面优化的具体思路及解决方案。

二、布局优化

关于布局优化的思想很简单,就是尽量减少布局文件的层级。这个道理很浅显,布局中的层级少了,就意味着Android绘制时的工作量少了,那么程序的性能自然就提高了。

如何进行布局优化?

  • ①删除布局中无用的控件和层次,其次有选择地使用性能比较低的ViewGroup。

关于有选择地使用性能比较低的ViewGroup,这就需要我们开发就实际灵活选择了。

例如:如果布局中既可以使用LinearLayout也可以使用RelativeLayout,那么就采用LinearLayout,这是因为RelativeLayout的功能比较复杂,它的布局过程需要花费更多的CPU时间。FrameLayout和LinearLayout一样都是一种简单高效的ViewGroup,因此可以考虑使用它们,但是很多时候单纯通过一个LinearLayout或者FrameLayout无法实现产品效果,需要通过嵌套的方式来完成。这种情况下还是建议采用RelativeLayout,因为ViewGroup的嵌套就相当于增加了布局的层级,同样会降低程序的性能。

  • ②采用标签,标签,ViewStub。

标签主要用于布局重用。 标签一般和配合使用,可以降低减少布局的层级。 ViewStub提供了按需加载的功能,当需要时才会将ViewStub中的布局加载到内存,提高了程序初始化效率。

③避免多度绘制

过度绘制(Overdraw)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的 UI 结构里面,如果不可见的 UI 也在做绘制的操作,会导致某些像素区域被绘制了多次,同时也会浪费大量的 CPU 以及 GPU 资源。 如下所示,有些部分在布局时,会被重复绘制。
关于过度绘制产生的一般场景及解决方案,参考:[Android 过度绘制优化]

三、绘制优化 绘制优化是指

View的onDraw方法要避免执行大量的操作,

这主要体现在两个方面:

①onDraw中不要创建新的局部对象。** 因为onDraw方法可能会被频繁调用,这样就会在一瞬间产生大量的临时对象,这不仅占用了过多的内存而且还会导致系统更加频繁gc,降低了程序的执行效率。

②onDraw方法中不要做耗时的任务,也不能执行成千上万次的循环操作,尽管每次循环都很轻量级,但是大量的循环仍然十分抢占CPU的时间片,这会造成View的绘制过程不流畅。

按照Google官方给出的性能优化典范中的标准,View的绘制频率保证60fps是最佳的,这就要求每帧绘制时间不超过16ms(16ms = 1000/60),虽然程序很难保证16ms这个时间,但是尽量降低onDraw方法中的复杂度总是切实有效的。

四、内存泄漏优化

内存泄漏是开发过程中的一个需要重视的问题,但是由于内存泄露问题对开发人员的经验和开发意识有较高的要求,因此也是开发人员最容易犯的错误之一。

内存泄露的优化分为两个方面:

①在开发过程中避免写出有内存泄漏的代码

②通过一些分析工具比如MAT来找出潜在的内存泄露,然后解决。

对应于两种不同情况,一个是了解内存泄漏的可能场景以及如何规避,二是怎么查找内存泄漏。

1.那么我们就先了解什么是内存泄漏?

这样我们才能知道如何避免。

大家都知道,java是有垃圾回收机制的,这使得java程序员比C++程序员轻松了许多,存储申请了,不用心心念念要加一句释放,java虚拟机会派出一些回收线程兢兢业业不定时地回收那些不再被需要的内存空间(注意回收的不是对象本身,而是对象占据的内存空间)。

Q1:什么叫不再被需要的内存空间?

**答:**Java没有指针,全凭引用来和对象进行关联,通过引用来操作对象。如果一个对象没有与任何引用关联,那么这个对象也就不太可能被使用到了,回收器便是把这些“无任何引用的对象”作为目标,回收了它们占据的内存空间。

Q2:如何分辨为对象无引用?

**答:**2种方法 引用计数法直接计数,简单高效,Python便是采用该方法。但是如果出现 两个对象相互引用,即使它们都无法被外界访问到,计数器不为0它们也始终不会被回收。为了解决该问题,java采用的是b方法。

可达性分析法这个方法设置了一系列的“GC Roots”对象作为索引起点,如果一个对象 与起点对象之间均无可达路径,那么这个不可达的对象就会成为回收对象。这种方法处理 两个对象相互引用的问题,如果两个对象均没有外部引用,会被判断为不可达对象进而被回收(如下图)。

Q3:有了回收机制,放心大胆用不会有内存泄漏?

**答:**答案当然是No! 虽然垃圾回收器会帮我们干掉大部分无用的内存空间,但是对于还保持着引用,但逻辑上已经不会再用到的对象,垃圾回收器不会回收它们。

这些对象积累在内存中,直到程序结束,就是我们所说的“内存泄漏”。 当然了,用户对单次的内存泄漏并没有什么感知,但当泄漏积累到内存都被消耗完,就会导致卡顿,崩溃。 下面这张图可以帮助我们更好地理解对象的状态,以及内存泄漏的情况

左边未引用的对象是会被GC回收的,右边被引用的对象不会被GC回收,但是未使用的对象中除了未引用的对象,还包括已被引用的一部分对象,那么内存泄漏久发生这部分已被引用但未使用的对象。

2.Android一般在什么情况下会出现内存泄漏?

①集合类泄漏
②单例/静态变量造成的内存泄漏
③匿名内部类/非静态内部类
④资源未关闭造成的内存泄漏 大概可以分为以上几类,还有一些经常会听到的Hanlder,AsyncTask引起内存泄漏,都属于上述③中的情况。 那么上述四种情况是怎么造成的内存泄漏,具体是什么原因,以及Android中一些知名的引起内存泄漏的原因,以及解决方法是怎么样的?

3.Android怎么分析内存泄漏?

上面介绍了内存泄漏的场景,对应的有一些解决方案。 那么在内存泄漏已经发生的情况下,我们该如何解决呢? 我们可以通过MAT(Memory Analyzer Tool),或者 LeakCanary来检测Android中的内存泄漏。

五、响应速度优化

响应速度优化的核心思想就是避免在主线程中做耗时操作

如果有耗时操作,可以开启子线程执行,即采用异步的方式来执行耗时操作。 如果在主线程中做太多事情,会导致Activity启动时出现黑屏现象,甚至ANR。Android规定,Activity如果5秒钟之内无法响应屏幕触摸事件或者键盘输入事件就会出现ANR,而BroadcastReceiver如果10秒钟之内还未执行完操作也会出现ANR。

为了避免ANR,可以开启子线程执行耗时操作,但是子线程不能更新UI,所以需要子线程与主线程进行通信来解决子线程执行耗时任务后,通知主线程更新UI的场景。关于这部分,需要掌握Handler消息机制,AsyncTask,IntentService等内容。

然而,在实际开发中,ANR仍然不可避免的发生了,而且很难从代码上发现,这时候就要用到ANR日志分析。当一个进程发生了ANR之后,系统会在/data/anr目录下创建一个文件traces.txt,通过分析这个文件就能定位出ANR的原因。

六、ListView/RecycleView及Bitmap优化

ListView/RecycleView的优化思想主要从以下几个方面入手:
①使用ViewHolder模式来提高效率
②异步加载:耗时的操作放在异步线程中
③ListView/RecycleView的滑动时停止加载和分页加载 具体优化建议及详情,Bitmap优化 主要是对加载图片进行压缩,避免加载图片多大导致OOM出现。

七、线程优化

线程优化的思想就是**采用线程池,避免程序中存在大量的Thread。**线程池可以重用内部的线程,从而避免了线程的创建和销毁锁带来的性能开销,同时线程池还能有效地控制线程池的最大并法术,避免大量的线程因互相抢占系统资源从而导致阻塞现象的发生。因此在实际开发中,尽量采用线程池,而不是每次都要创建一个Thread对象。

八、其他性能优化建议

①避免过度的创建对象
②不要过度使用枚举,枚举占用的内存空间要比整型大
③常量请使用static final来修饰
④使用一些Android特有的数据结构,比如SparseArray和Pair等
⑤适当采用软引用和弱引用
⑥采用内存缓存和磁盘缓存
⑦尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄漏。

以上是关于Android性能优化方面,我们一些入手点。从这些方面,我们可以在平时的开发中注意,避免类似错误,提高Android程序的性能,但是其中一些方面的要求则需要我们不断的学习,以及平时良好的意识与习惯。由于自己开发经验几乎为0,没办法根据实际经验来说明,只能写下这篇文章来提醒自己以后开发的时候需要注意和培养的地方。

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套**腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节**,由于篇幅有限,这里以图片的形式给大家展示一部分。

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

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

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

1499853811)]

【算法合集】

[外链图片转存中…(img-QXEvGVWx-1621499853814)]

【延伸Android必备知识点】

[外链图片转存中…(img-fPjwCSZT-1621499853817)]

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

你会的还只有初级工程师的技术吗?实战篇相关推荐

  1. 你会的还只有初级工程师的技术吗?灵魂拷问

    开头 Android开发,假如开始没有任何的开发经验的话, 千万不要着急,不要想着在短时间内就把一个语言学习好, 因为你之前没有任何的学习经验, 在这个过程中需要有耐心地学习完JAVA的基础知识, 然 ...

  2. 数学建模——运输问题,你会的还只有初级工程师的技术吗

    罚数向量: [0.0, 1.0, 1.0, 2.0, 5.0, 1.0, 3.0] 最大罚数: 5.0 元素序号: 5 对第 2 列进行操作: [12. 10. 5.] 最小成本所在行索引: 2 本次 ...

  3. 前端-初级工程师掌握技术点

    前端-初级工程师技术点 一.技能 1.对Promise的理解.优缺点 Promise基本特性 Promise有三种状态:pending(进行中).fulfilled(已成功).rejected(已失败 ...

  4. 面试总结----java初级工程师

    最近在找java初级工程师的工作,投了很多简历都没有反馈,只收到了几个面试通知,可能是因为工作年限和项目经历都不是很丰富,另外一个原因可能是之前接触的技术不新,对于现在想进互联网公司来说,技术上不太符 ...

  5. 【iVX 初级工程师培训教程 10篇文拿证】01 了解 iVX 完成新年贺卡

    目录 [iVX 初级工程师培训教程 10篇文拿证]01 了解 iVX 完成新年贺卡 [iVX 初级工程师培训教程 10篇文拿证]02 数值绑定及自适应网站制作 [iVX 初级工程师培训教程 10篇文拿 ...

  6. 【iVX 初级工程师培训教程 10篇文拿证】02 数值绑定及自适应网站制作

    目录 [iVX 初级工程师培训教程 10篇文拿证]01 了解 iVX 完成新年贺卡 [iVX 初级工程师培训教程 10篇文拿证]02 数值绑定及自适应网站制作 [iVX 初级工程师培训教程 10篇文拿 ...

  7. 【iVX 初级工程师培训教程 10篇文拿证】03 事件及猜数字小游戏

    目录 [iVX 初级工程师培训教程 10篇文拿证]01 了解 iVX 完成新年贺卡 [iVX 初级工程师培训教程 10篇文拿证]02 数值绑定及自适应网站制作 [iVX 初级工程师培训教程 10篇文拿 ...

  8. 【iVX 初级工程师培训教程 10篇文拿证】05 画布及飞机大战游戏制作

    目录 [iVX 初级工程师培训教程 10篇文拿证]01 了解 iVX 完成新年贺卡 [iVX 初级工程师培训教程 10篇文拿证]02 数值绑定及自适应网站制作 [iVX 初级工程师培训教程 10篇文拿 ...

  9. 【iVX 初级工程师培训教程 10篇文拿证】06 数据库及服务

    目录 [iVX 初级工程师培训教程 10篇文拿证]01 了解 iVX 完成新年贺卡 [iVX 初级工程师培训教程 10篇文拿证]02 数值绑定及自适应网站制作 [iVX 初级工程师培训教程 10篇文拿 ...

最新文章

  1. Scrapy 爬虫实例 抓取豆瓣小组信息并保存到mongodb中
  2. 组策略禁止自动锁定计算机,如何在Windows 10中禁用自动锁定
  3. 屠龙之路_战胜View对DataBase猛烈进攻_ThirdDay
  4. 生产模式MTOMTS的区别
  5. 基于LSTM的股票价格预测(完整金融类代码)
  6. 061_Apex 异常捕捉
  7. php多商户限时抢购,GitHub - 617746883/thinkphp5.0_shop: 基于thinkphp5,多商户商城。积分商城、团购、秒杀、拍卖、夺宝等多插件(持续开发中)...
  8. Windows安装.net Framework时安装不上,提示已处理证书链,但是在不受信任提供程序信任的根证书中终止
  9. java 错误日期转正确日期_java – jdk8日期转换中的错误?
  10. tcp连接时,BROKEN PIPE错误
  11. php 多元数组,php数组_php多元数组
  12. IDEA 下载、安装、配置和案例
  13. nginx 加上ssl配置
  14. 苏州新导蓝牙定位系统原理精确解读,三分钟看懂蓝牙定位
  15. 工业物联网(IIoT)生态构建三字经:先做人、后修心、再打怪!
  16. 屏幕不光只看尺寸 各材质屏幕实战解析
  17. Asciidoctor基础语法
  18. 【获取内置命令ID】:VBA编程人员常用的工具。可以查询Excel内部命令的ID号
  19. 给地震监视器添加Notification
  20. 怎么才能把windows里的文件复制到虚拟机的linux中去

热门文章

  1. Hello, QML!
  2. 开关类传感器输入案例 arduino玛克君
  3. 0-1背包问题及变种
  4. MFC中CPropertySheet与CTabCtrl的使用
  5. MySQL8.0.27安装后,使用CMD无法启动mysql服务
  6. CA6110发动机曲轴的加工工艺及夹具设计-说明书+外文翻译+夹具体+毛配图+曲轴零件图+夹具装配图+垫块图+工艺卡片10张
  7. MySQL的客户端/服务器架构
  8. 计算机主板没电默认时间,主板电池没电了会出现什么情况
  9. Python入门第四天——[小甲鱼]零基础入门学习Python
  10. 不使用内置函数的情况下,如何使用Python实现求平均值、最大值和最小值?