首页 > 编程知识 正文

android最新面试题及答案,安卓面试题

时间:2023-05-03 13:48:53 阅读:125871 作者:3344

前言阿里巴巴作为国内互联网公司的龙头,既是行业标杆,也是阿里背景的程序员和权威。 作为程序员,知道蚂蚁对员工的要求有多高,技术人员掌握的技术水平更是望尘莫及。 因此,大厂商程序员的很多经验也值得我们借鉴和学习,在一定程度上确实可以帮助我们“抄近路”。

今天,我们想分享的是,Alibaba技术官落下的这一系列学习资料** 《打破这层壁垒,成为架构师吧!》突破了自己,你不如来自修订者的这本高级笔记。 这个笔记本必须爱一个人。 现在,在GitHub上的热度标记着星星6k。 **由此可见同行对本文的认可程度,这也意味着对我们的学习和技术的提高有很大的帮助。

另一方面,在安卓性能优化方面对于安卓性能优化,主要有以下有效的优化方法:

1 .布局优化

2 .优化绘图

3 .内存泄漏优化

4 .响应速度优化

5.ListView/RecycleView和位图优化

6 .线程优化

7 .其他绩效优化建议

这里具体介绍了有关这些优化的具体思路和解决方案。

二、优化布局优化布局的思想很简单,就是尽量减少布局文件的层次。 这个道理很简单,布局中的层次越少,Android绘制时的工作量就越少,这当然会提高程序的性能。

如何进行布局优化?

删除布局中无用的控件和层次,其次有选择地使用性能比较低的ViewGroup。对于选择性使用性能较低的ViewGroup,需要我们开发并实际灵活选择。

例如,如果布局同时提供线性布局和关系布局,则使用线性布局,因为关系布局功能复杂,布局过程需要大量的CPU时间。 由于框架布局与线性布局一样是简单高效的视图组,因此您可能会考虑使用它们,但在许多情况下,一个线性布局或框架布局无法实现产品的简单效果,因而无法嵌套在这种情况下,建议使用关系布局。 ViewGroup嵌套相当于提高布局级别,也会降低程序性能。

采用标签,标签,ViewStub。标签主要用于布局重用。 将标签与配合使用可以降低布局的级别。 ViewStub提供按需加载的功能,并根据需要将ViewStub中的布局加载到内存中,从而提高程序初始化效率。

避免多度绘制

“复盖”(Overdraw )表示在同一帧的时间内多次绘制屏幕上的像素。 在多层重叠的UI结构中,如果看不见的UI也在进行绘制操作,则会多次绘制某些像素区域,同时浪费大量的CPU和GPU资源。 如下所示,布局中有重复绘制的部分。

有关过度绘制的常见场景和解决方案,请参见“[Android过度绘制优化”

三、绘图优化绘图优化是指View的onDraw方法要避免执行大量的操作,

这主要体现在两个方面。

不在onDraw中创建新的本地对象。 由于onDraw方法可能会频繁调用,因此会临时生成大量对象。 这不仅会消耗大量内存,而且会频繁发生系统gc,降低程序的执行效率。

onDraw方式下,请勿执行耗时的任务,也不要执行上千次循环操作。 尽管每个循环都很轻,但View绘制过程并不顺畅,因为大量循环足够切断了CPU的时间片。

根据谷歌官方给出的性能优化模型中的标准,View的绘制频率最好保证为60fps,为此,每帧的绘制时间必须小于或等于16ms。 (16ms=1000/60 )虽然程序很难保证16ms的时间,但是尽量降低开启方式的复杂度是非常有效的。

四、内存泄漏优化内存泄漏是开发中的重要问题之一,而内存泄漏问题由于对开发者的经验和开发意识有很高的要求,也是开发者最容易犯的错误之一。

内存泄漏优化有两个方面:

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

通过一些分析工具比如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,没办法根据实际经验来说明,只能写下这篇文章来提醒自己以后开发的时候需要注意和培养的地方。

最后

希望大家能有一个好心态,想进什么样的公司要想清楚,并不一定是大公司,我选的也不是特大厂。当然如果你不知道选或是没有规划,那就选大公司!希望我们能先选好想去的公司再投或内推,而不是有一个公司要我我就去!还有就是不要害怕,也不要有压力,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer !如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。可以点击蓝色字体免费获取

少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。可以点击蓝色字体免费获取

[外链图片转存中…(img-dBH2Q3X8-1619755003211)]

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。