Android面试题汇总(四)

Android 性能调优相关

1、谈谈你对Android性能优化方面的了解?

启动优化:app启动的时候不做耗时操作,尽量把没有必要的初始化代码异步操作

布局优化:减少代码层数,使用约束布局或者时layout优化的标签(include\viewStub\merge)

apk优化:代码进行lint检测优化代码,资源图片使用较小的或者时webp,混淆打包为apk瘦身

性能、电量、网络优化:

1、推送用来代替轮询

2、app处于后台的时候,关闭非必要的数据传输

3、数据传输被拒绝,不要写无限重连的代码

4、后台关闭后,网络请求取消

5、选择相应的定位服务,比如网络定位和GPS定位

6、activity直接使用activityForResult代替广播

7、使用缓存策略

内存优化:

1、for循环的时候,非必要不要创建局部变量,这样会堆中会产品很多临时对象

2、没有用的对象及时回收

3、集合中不要只做只增不减的操作

4、关闭资源:IO流、注册的监听、数据库等

5、不要使用静态、静态变量或者静态内部类

6、图片加载的时候,大图需要压缩或者list中使用缩量图,使用完的图片要及时回收

7、adapter缓存

2、一般什么情况下会导致内存泄漏问题?如何解决

1、我们的资源没有关闭:注册的监听,数据库,IO流等,对资源进行关闭

2、图片使用完没有回收,对bitmap进行回收

3、内部类持有外部类的引用造成外部类无法回收,内部类使用静态和弱引用解决

4、Activity  Context造成的内存溢出,比如在线程中使用线程和Activity生命周期不一致使用静态和弱引用解决,在单例模式中也是持有了外部类导致无法回收使用静态和弱引用解决

5、Handler和内部类一样

6、集合只增不减也会造成,需要合理的增减内容

3、自定义 Handler 时如何有效地避免内存泄漏问题?

handler使用静态内部类,这样就不会持有外部Activity的引用导致Activity无法被GC回收,然后使用弱引用这样Activity被回收的时候,我们不去执行代码,然后在Activty销毁的时候removeCallbackAndMessage

4、哪些情况下会导致OOM问题?如何解决?

1、内存泄漏的过多  2、加载了大图  3、创建了过多的线程

增大内存:Activity在清单文件的节点上增加lagerHeep=true来增加我们的内存

减少内存的使用:1、避免内存泄漏   2、图片使用三方框架  3、业务上的数据可以分批次的加载

5、ANR 出现的场景以及解决方案?

ANR:程序无响应5s则会ANR

出现的场景:主线程做了耗时操作、CPU和内存占用多大

解决方法:不在主线程做大量的耗时操作   优化代码减少CPU的处理时间  合理管理内存防止内存泄漏

6、谈谈 Android 中内存优化的方式?

1、及时关闭资源:IO流、数据量,监听,bitmap复用及时回收

2、单例、Handler、线程、非静态内部类造成的内存泄漏,可以使用静态+弱引用解决

3、集合不要做只增不减的操作

4、合理使用静态成员和静态内部类

7、谈谈布局优化的技巧?

约束布局、include、merge、viewStub

1个标签可以实现的就不要用2个标签:drawLeft....

子控件公用的属性可以放在父布局

8、对于 Android 中图片资源的优化方案你知道哪些?

1、采用二次采样的方法,缩小图片进行存储

2、三级缓存的方式,内存、本地、网络。内存中可以加快渲染速度、本地就是SD卡、网络就是网络访问

3、图片加载的时候需要解码,不用格式的码率不用。耗费的内存也不一样

4、bitmap使用的时候复用、并且及时回收  较少内存的开销

9、Android Native Crash 问题如何分析定位?

本地:NDK的命令查看

线上:TestIn或者Bugly查看

10、该如何给 Apk 瘦身?

1、混淆代码,去除无用的资源文件

2、资源文件,图片使用webP或者svg

3、使用.9代替自己绘制的shape

11、说一下你是如何优化 App 启动过程的?

1、优化耗时操作,非必要立马初始化的可以放在子线程中

2、白屏的优化,启动一个空白的Activity跳转到真正的Activty

12、谈谈代码混淆的步骤?

1、Gradle配置开启混淆

2、混淆文件配置混淆规则

四大组件和View可以不混淆、实体类不可以混淆、第三方根据各自的规则混淆

混淆的目的:减少apk的体积,加大发编译的难度这样更加安全

13、如何处理大图的加载?

根据需求,如果是要求展示全部可以不清晰,就压缩后展示或者降低精度在或者修改图片的格式。如果要求质量很高但是不要求全部展示可以进行局部加载然后在拖动展示

14、谈谈如何对网络请求进行优化?

1、post的数据和相应的数据进行GZip压缩,减少数据的传输

2、使用图片的加载框架

3、图片的访问携带图片的格式、大小、或者是否压缩的参数访问

4、wifi、数据、弱网、没有网络的时候判断,然后网络越好数据加载的越多

15、请谈谈如何加载Bitmap并防止内存溢出?

1、对图片进行压缩显示

2、bitmap进行复用

3、bitmap及时回收

Android 中的 IPC

1、请回答一下 Android 中进程间通信有哪些方式?

1、Bundle

2、文件共享

3、ContentProvider

4、Socket

5、Messenger

6、AIDL

Android 系统 SDK 相关

1、请简要谈谈 Android 系统的架构组成?

1、应用层:核心的应用会和android系统一起打包,就是手机自己的应用:通讯录、短信、闹钟、日历等。

2、应用架构层:应用层的api使用,包括四大组件,AMS,WMS等

3、应用架构运行层:里面是我们应用架构的底层,里面是C/C++写的Lib库。还有我们的虚拟机

4、Linux层:包含的是Linux底层的东西,包括驱动、网络协议、内存管理等

2、SharedPreferences 是线程安全的吗?它的 commit 和 apply 方法有什么区别?

SharedPreferences是线程安全的,里面是用了大量的 synchronized 进行修饰的。当我们set数据的时候,这个时候如果在进行get或者是set就是需要等待之前操作完成后才执行。commit和apply都是提交数据的方法,他们首先都会缓存到内存中一份,只是commit会同步到磁盘有返回值是否成功,而apply是异步操作的并且没有返回值是否成功

3、Serializable 和 Parcelable 有哪些区别?

Serializable是Java提供的,Parcelable是安卓提供的

Serializable使用简单,效率慢。Parcelable号称是Serializable速度的10倍但是使用的难一点

Seriaizable适合持久化数据和网络传输,Parcelable适合内存间的传递,因为安卓的每个版本不同,所以他不适合做持久化操作

4、请说一下 Android 7.0 的新特性?

1、双屏显示

2、后台电量优化、安装策略不同安装效率高

3、文件的私有化和共享,FileProvider

4、通知栏的改变

5、支持VR

5、谈谈 ArrayMap 和 HashMap 的区别?

ArrayMap底层是双数组,HashMap是数据加链表。在数据的查找方式上,HashMap是根据hash值确定index,而arrayMap是通过二分查找的方式,所以数据大的时候HashMap是占优的

扩容方式不同,HashMap初始值是16内次扩容乘以2。ArrayMap小于4扩容到4,大于等于4扩容到8  以后每次乘以1.5.  

扩容的性能上ArrayMap占优,因为他执行的是System.copyArrar(),hashmap每次扩容需要重写计算位置。所以数据量小的情况使用ArrayMap

Arrary内存占用少,HashMap内存占用的大

总的来说就是数据量大的时候选择HashMap,数据量小的时候使用ArrayMap

6、Android 中为什么推荐用 SparseArray 代替 HashMap?

SparseArray不能完全替代HashMap的,当数据量小于1000并且key是int的时候效率才能优于HashMap.  SparseArray的key是int类型底层是2个数据keys和values 因此key不需要装箱和拆箱的操作,也不会出现hash冲突,在数据查询的时候是二分查找效率也还可以。数据结构上也是比HashMap更加单,不需要维护链表了

7、说说 HttpClient 与 HttpUrlConnection 的区别?为何前者会被替代?

HttpClient是的api十分庞大,只适用于android  不好维护。

但是httpurlConnection是轻便的灵活的,api使用简单

8、什么是Lifecycle?请分析其内部原理和使用场景?

LifeCycle是JetPack的一个组件,为了监听生命周期的。通过owner和Obsever的方式实现的

AndroidX后CompatActivity的父类ComponentActivity实现了LifeCycleOwer.是现实我们只要实现Observer然后绑定给Activity就实现了

比如我们自定义Observer然后实现onResume,onStop播放和暂停音频,然后Oberser里面标签定义生命周期和实现方法,然后把这个Obsever绑定给Activity就实现了

9、谈一谈 Android 的签名机制?不同版本下的签名有什么不同?

V1:安卓7.0之前的签名方式,是对条目进行压缩

V2:安卓7.0之后的签名方式,是对所有的字节进行压缩,更安全,安卓规则发生了改变安装效率也高

我们如果只勾选v1签名,安卓7.0后的安装策略不同也会兼容不影响,只勾选v2则7.0之前不能安装。v1v2全勾选才行,7.0后的安装效率也会提高

10、简述一下 Android 8.0、9.0 分别增加了哪些新特性?

Android8.0:未知来源安装、通知渠道可以进行分类(不重要的通知)

9.0:刘海屏、全面屏、夜间模式、必须使用Https

10.0:单独沙盒模式、外部无法启动Activty

11、谈谈 Android 10 更新了哪些内容?如何进行适配?

沙箱模式

后台程序无法启动Activity

12、Java 与 JS 代码如何互调?有做过相关优化吗?

WebView

java调用JS:loadUrl加载javaScript

js调用java:URL携带参数的形式,JS桥

第三方框架分析

 1、说说 EventBus 的实现原理?

EventBus是事件总线,实现原理三个方面讲述

1、register(事件的注册):EventBus.getDefault().register(this); 首先getDefault是一个单例模式,然后注册的时候传入this,获取到class.然后通过反射机制拿到订阅者注册的方法(public  参数只能有一个),在EventBus中有2个map的集合分别存储class+eventType和eventType+实体(class+方法),用这个有个集合存储反射的内容。这2个集合就是缓存的作用,当然在添加的时候也会做缓存的判断如果有就不去put了。 订阅者的方法还可以设置线程机制、优先级和粘性事件,粘性事件如果定义则马上发送

2、unRegister(事件的注销):通过class对象,情况上诉的2个集合,对缓存进行清除

3、post(事件的发送):根据发送的数据,线程将其添加到事件的队列中,然后根据事件类型遍历所有订阅者,然后通过反射机制执行所有订阅者订阅的方法

2、谈谈网络请求中的拦截器 - Interceptor 的实现原理和使用场景?

使用场景:重试和重连、日志打印、请求头响应头拦截器,参数拦截器、自定义缓存拦截器

3、谈一谈 Glide 中的缓存机制?

Glide的缓存机制分为弱引用、LurCache、和DiskLurCache(磁盘).内存缓存时为了解决重复引用图片加载到内存中占用内存的问题,磁盘缓存是为了防止重复访问网络的问题

读取的顺序是弱引用->LurCache->DiskLurCache->网络

写入的顺序是网络->diskLurCache->LurCache->弱引用

内存缓存中分为LurCache和弱引用,Glide中有个计数器判断图片是否被引用,当图片被加载的时候引用的是我们的弱引用,当图片没有被引用的时候是缓存在LurCache中的

4、ViewModel 的出现是为了解决什么问题?并简要说说它的内部原理?

1、可以解决Acvity横竖屏切换数据保存的问题,VM的生命周期和Activity是一样的

2、实现数据回收的统一管理,调用onCleared()

帮助管理UI组件的生命周期并存储和管理UI相关的数据。

5、请说说依赖注入框架 ButterKnife 的实现原理?

1、通过注解器在编译期间会生成对应的文件XX_ViewBinding,注解器中会添加特定的注解,查找XX中特定的注解,然后拼接字符串写到XX_ViewBinding中

2、XX_ViewBinding持有XX的引用实现findviewbyid和点击事件

3、XX中对XX_ViewBinding进行初始化完成打通

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GB/T 14710-2009 医用电器环境要求及试验方法

举个例子: 应符合GB/T 14710-2009中气候环境试验II组,机械环境试验II组的要求。 气候环境试验II组,机械环境试验II组? 这是2个属性,先按特定的条件分组,分组后,应该满足该组的特定要求。这个标…

Linux面试题汇总1

MySQL数据库 1、MySQL和Oracle的区别 1.Oracle是大型数据库,而MySQL是中小型数据库。但是MySQL是开源的,但是Oracle是收费的,而且比较贵。 2. Oracle的内存占有量非常大,而mysql非常小 3. MySQL支持主键自增长,指定主…

Ubuntu设置开机执行sh脚本

Ubuntu设置开机执行sh脚本 /etc/systemd/system 目录下新增后缀 service文件,eg: start.service ,文件内容如下 [Unit]Description描述信息 Afternetwork.target[Service]# 需要执行的sh文件路径,需要绝对路径 ExecStart/usr/xxx/start.shKillModenone Restarton-…

makefile之自动化变量

makefile之自动化变量 常见自动化变量应用举例 常见自动化变量 $&#xff1a;目标文件。在模式规则中&#xff0c;$代表符合模式的目标文件集合中的一个目标文件。 $<&#xff1a;第一个依赖文件。在模式规则中&#xff0c;$<代表符合模式的依赖文件集合中的第一个依赖…

Java初级到中级:技术提升的策略与方法

文章目录 1 问题背景2 前言3 方法 1 问题背景 截至2023年7月&#xff0c;笔者已经毕业2年了&#xff0c;每天都在搬砖打螺丝&#xff0c;自我感觉需要沉淀、思考、总结一下。思考和总结一下如何从Java初级提升到Java中级&#xff0c;需要掌握一些什么方法论&#xff0c;有效地去…

gulp 错误集锦

为了打包构建之前的layui写的项目&#xff0c;用到了gulp&#xff0c;但是遇到的坑还挺多&#xff0c;记录一下。 1、运行gulp时报错 ReferenceError: primordials is not defined 解决办法&#xff1a; ReferenceError: primordials is not defined 意思是primordials这个没…

html文件中引入.ts文件并运行

问题&#xff1a; 一个项目&#xff0c;是用TypeScript编写的&#xff0c;但是html中引入了.ts文件后报错了&#xff0c;有没有办法跳过tsc这个编译命令&#xff0c;不然每次都需要Tsc编译一下后再启动&#xff0c;有点麻烦 <!doctype html> <html lang"zh-CN&q…

宝塔Node部署nuxt3

宝塔Node部署nuxt3 1、首先本地执行打包 yarn build2、然后把目录中的这个文件压缩成zip 3、在宝塔文件处添加一个网站的文件目录&#xff0c;并把文件解压到里面 4、点击左侧的网站&#xff0c;然后选择node项目&#xff0c;选择node版本安装 5、安装完后&#xff0c;点击新…

03-Zookeeper客户端使用

上一篇&#xff1a;02-Zookeeper实战 1. 项目构建 zookeeper 官方的客户端没有和服务端代码分离&#xff0c;他们为同一个jar 文件&#xff0c;所以我们直接引入zookeeper的maven即可&#xff0c; 这里版本请保持与服务端版本一致&#xff0c;不然会有很多兼容性的问题 <…

Minecraft 1.20.x Forge模组开发 06.建筑生成

我们本次尝试在主世界生成一个自定义的建筑。 效果展示 效果展示 效果展示 由于版本更新缘故,1.20的建筑生成将不涉及任何Java包的代码编写,只需要在数据包中对建筑生成进行自定义。 1.首先我们要使用游戏中的结构方块制作一个建筑,结构方块使用教程参考1.16.5自定义建筑生…

el-menu 导航栏学习(1)

最简单的导航栏学习跳转实例效果&#xff1a; &#xff08;1&#xff09;index.js路由配置&#xff1a; import Vue from vue import Router from vue-router import NavMenuDemo from /components/NavMenuDemo import test1 from /components/test1 import test2 from /c…

【Rust日报】2023-09-26 Deadpool v0.10 发布

Deadpool v0.10 发布 Deadpool是一个简单易用的异步连接和支持任意类型对象的池。 这个包提供了两种实现方式&#xff1a; 托管池&#xff08; deadpool::managed::Pool &#xff09; 根据需要创建和回收对象适用于数据库连接池通过 Cargo.toml 中的 managed 功能实现 未管理的…

前端工作日常

机缘 记录和遇到的问题作为记录 收获 收获代码提高和认知 日常 使用js去操作数组或者对象 空闲时间可以多学学基础算法 比如&#xff08;冒泡&#xff0c;倒序&#xff0c;去重&#xff0c;笛卡尔积算法&#xff0c;各种各样的排序方法等等等&#xff09; 正确良好的使用循环…

nodejs+vue 经典建筑网站elementui

第1章 项目概述 1 1.1 问题描述 1 1.2 项目目标 1 1.3 项目适用范围 2 1.4 项目应遵守的规范与标准 2 1.5 涉众 2 具有功能强大、支持跨平台、运行速度快、安全性高、成本低等优点。而对于后者我们使用 来完成它&#xff0c;使其网页功能完备&#xff0c;界面友好、易开发、易…

程序通过命令行获取操作系统名称+版本+CPU名称等:Part2

文章目录 &#xff08;一&#xff09;沿用的方法&#xff08;二&#xff09;问题和调整&#xff08;2.1&#xff09;Windows11的版本号是10.0&#xff08;2.2&#xff09;Golang和管道符号&#xff08;Linux&#xff09;&#xff08;2.3&#xff09;最大内存容量 vs 当前安装内…

华为云云耀云服务器L实例评测|使用华为云耀云服务器L实例的CentOS部署Docker并运行Tomcat应用

目录 前言 步骤1&#xff1a;登录到华为云耀云服务器L实例 步骤2&#xff1a;安装Docker 并验证Docker安装 步骤3&#xff1a;拉取Tomcat镜像并运行Tomcat容器 步骤4&#xff1a;放行8080端口 步骤5&#xff1a;访问tomcat 步骤6&#xff1a;管理Tomcat容器 小结 前言 …

【c语言的malloc函数介绍】

malloc&#xff08;memory allocation的缩写&#xff09;是C语言中的一个函数&#xff0c;用于动态分配内存空间。这个函数允许你在程序运行时请求指定大小的内存块&#xff0c;以供后续使用。malloc函数属于标准库函数&#xff0c;需要包含头文件#include <stdlib.h> 才…

NLP 项目:维基百科文章爬虫和分类 - 语料库阅读器

塞巴斯蒂安 一、说明 自然语言处理是机器学习和人工智能的一个迷人领域。这篇博客文章启动了一个具体的 NLP 项目&#xff0c;涉及使用维基百科文章进行聚类、分类和知识提取。灵感和一般方法源自《Applied Text Analysis with Python》一书。 在接下来的文章中&#xff0c;我将…

回调地狱的产生=>Promise链式调用解决

常见的异步任务包括网络请求、文件读写、定时器等。当多个异步任务之间存在依赖关系&#xff0c;需要按照一定的顺序执行时&#xff0c;就容易出现回调地狱的情况。例如&#xff0c;当一个网络请求的结果返回后&#xff0c;需要根据返回的数据进行下一步的操作&#xff0c;这时…

本地项目远程Linux运行

文章目录 1 本地安装anconda&#xff08;如果不需要在本地运行&#xff0c;这步可以忽略&#xff09;2 进入本地conda环境&#xff08;如果不需要在本地运行&#xff0c;这步可以忽略&#xff09;2.1 查看已存在的环境2.2 创建新的conda环境2.3 激活新建的环境2.4 安装tensorfl…