-
onPostExecute():在异步任务执行之后回调,在主线程中执行
-
onCancelled():在异步任务被取消时回调
3、AsyncTask工作原理
4、AsyncTask引起的内存泄漏
-
原因:非静态内部类持有外部类的匿名引用,导致Activity无法释放
-
解决:
-
AsyncTask内部持有外部Activity的弱引用
-
AsyncTask改为静态内部类
-
AsyncTask.cancel()
5、AsyncTask生命周期
在Activity销毁之前,取消AsyncTask的运行,以此来保证程序的稳定
6、AsyncTask结果丢失
由于屏幕旋转、Activity在内存紧张时被回收等情况下,Activity会被重新创建,此时,旧的AsyncTask持有旧的Activity引用,这个时候会导致AsyncTask的onPostExecute()对UI更新无效
7、AsyncTask并行or串行
-
AsyncTask在Android 2.3之前默认采用并行执行任务,AsyncTask在Android 2.3之后默认采用串行执行任务
-
如果需要在Android 2.3之后采用并行执行任务,可以调用AsyncTask的executeOnExecutor()
=============================================================
HandlerThread面试题
1、HandlerThread产生背景
当系统有多个耗时任务需要执行时,每个任务都会开启一个新线程去执行耗时任务,这样会导致系统多次创建和销毁线程,从而影响性能。为了解决这一问题,Google提供了HandlerThread,HandlerThread是在线程中创建一个Looper循环器,让Looper轮询消息队列,当有耗时任务进入队列时,则不需要开启新线程,在原有的线程中执行耗时任务即可,否则线程阻塞
2、HanlderThread的特点、
-
HandlerThread本质上是一个线程,继承自Thread
-
HandlerThread有自己的Looper对象,可以进行Looper循环,可以创建Handler
-
HandlerThread可以在Handler的handlerMessage中执行异步方法
-
HandlerThread优点是异步不会堵塞,减少对性能的消耗
-
HandlerThread缺点是不能同时继续进行多任务处理,需要等待进行处理,处理效率较低
-
HandlerThread与线程池不同,HandlerThread是一个串行队列,背后只有一个线程。
IntentService面试题
================
IntentService是继承自Service并处理异步请求的一个类,其内部采用HandlerThread和Handler实现的,在IntentService内有一个工作线程来处理耗时操作,其优先级比普通Service高。当任务完成后,IntentService会自动停止,而不需要手动调用stopSelf()。另外,可以多次启动IntentService,每个耗时操作都会以工作队列的方式在IntentService中onHandlerIntent()回调方法中执行,并且每次只会执行一个工作线程
2、IntentService使用方法
-
创建Service继承自IntentService
-
覆写构造方法和onHandlerIntent()方法
-
在onHandlerIntent()中执行耗时操作
=============================================================
=============================================================
视图工作机制面试题
=============================================================
ListView面试题
ListView是能将一个数据集合以动态滚动的方式展示到用户界面上的View
2、ListView的RecycleBin机制
3、ListView的优化
-
重用convertView
-
使用ViewHolder
-
图片三级缓存
-
监听滑动事件
-
少用透明View
-
开启硬件加速
Android项目构建面试题
=============================================================
1、android构建流程
2、jenkins持续集成构建
3、Git常用命令
-
git init:仓库的初始化
-
git status:查看当前仓库的状态
-
git diff:查看仓库与上次修改的内容
-
git add:将文件放进暂存区
-
git commit:提交代码
-
git clone:克隆代码
-
git bransh:查看当前分支
-
git checkout:切换当前分支
4、git工作流
-
fork/clone(主流)
-
fork:将别人的仓库代码fork到自己的仓库上
-
clone:克隆下自己仓库的代码
-
update、commit:修改代码并提交到自己的仓库
-
push:提交到自己的仓库
-
pull request:请求添加到别人的仓库
-
clone
5、proguard是什么
ProGuard工具是用于压缩、优化和混淆我们的代码,其主作用是移除或混淆代码中无用类、字段、方法和属性
6、proguard技术功能
-
压缩
-
优化
-
混淆
-
预检测
7、proguard工作原理
将无用的字段或方法存入到EntryPoint中,将非EntryPoint的字段和方法进行替换
8、为什么要混淆
由于Java是一门跨平台的解释性语言,其源代码被编译成class字节码来适应其他平台,而class文件包含了Java源代码信息,很容易被反编译
ANR面试题
1、什么是ANR
Application Not Responding,页面无响应的对话框
2、发生ANR的条件
应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件满足时,就会弹出ANR的对话框
-
Activity超过5秒无响应
-
BroadcastReceiver超过10秒无响应
-
Service超过20秒无响应
3、造成ANR的主要原因
主线程被IO操作阻塞
-
Activity的所有生命周期回调都是执行在主线程的
-
Service默认执行在主线程中
-
BoardcastReceiver的回调onReceive()执行在主线程中
-
AsyncTask的回调除了doInBackground,其他都是在主线程中
-
没有使用子线程Looper的Handler的handlerMessage,post(Runnable)都是执行在主线程中
4、如何解决ANR
-
使用AsyncTask处理耗时IO操作
-
使用Thread或HandlerThread提供优先级
-
使用Handler处理工作线程的耗时操作
-
Activity的onCreate和onResume回调尽量避免耗时操作
OOM面试题
OOM指Out of memory(内存溢出),当前占用内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out of memory异常
2、OOM相关概念
-
内存溢出:指程序在申请内存时,没有足够的空间供其使用
-
内存泄漏:指程序分配出去的内存不再使用,无法进行回收
-
内存抖动:指程序短时间内大量创建对象,然后回收的现象
3、解决OOM
Bitmap相关
-
图片压缩
-
加载缩略图
-
在滚动时不加载图片
-
回收Bitmap
-
使用inBitmap属性
-
捕获异常
其他相关
-
listview重用convertView、使用lru
-
避免onDraw方法执行对象的创建
-
谨慎使用多进程
Bitmap面试题
=============================================================
1、recycle
-
在安卓3.0以前Bitmap是存放在堆中的,我们只要回收堆内存即可
-
在安卓3.0以后Bitmap是存放在内存中的,我们需要回收native层和Java层的内存
-
官方建议我们3.0以后使用recycle方法进行回收,该方法也可以不主动调用,因为垃圾回收器会自动收集不可用的Bitmap对象进行回收
-
recycle方法会判断Bitmap在不可用的情况下,将发送指令到垃圾回收器,让其回收native层和Java层的内存,则Bitmap进入dead状态
-
recycle方法是不可逆的,如果再次调用getPixels()等方法,则获取不到想要的结果
2、LruCache原理
LruCache是个泛型类,内部采用LinkedHashMap来实现缓存机制,它提供get方法和put方法来获取缓存和添加缓存,其最重要的方法trimToSize是用来移除最少使用的缓存和使用最久的缓存,并添加最新的缓存到队列中
3、计算inSampleSize
4、缩略图
5、保存Bitmap
6、保存到SD卡
7、三级缓存
-
网络缓存
-
本地缓存
-
内存缓存
UI卡顿面试题
1、UI卡顿原理
View的绘制帧数保持60fps是最佳,这要求每帧的绘制时间不超过16ms(1000/60),如果安卓不能在16ms内完成界面的渲染,那么就会出现卡顿现象
2、UI卡顿的原因分析
-
在UI线程中做轻微的耗时操作,导致UI线程卡顿
-
布局Layout过于复杂,无法在16ms内完成渲染
-
同一时间动画执行的次数过多,导致CPU和GPU负载过重
-
overDraw,导致像素在同一帧的时间内被绘制多次,使CPU和GPU负载过重
-
View频繁的触发measure、layout,导致measure、layout累计耗时过多和整个View频繁的重新渲染
-
频繁的触发GC操作导致线程暂停,会使得安卓系统在16ms内无法完成绘制
-
冗余资源及逻辑等导致加载和执行缓慢
-
ANR
3、UI卡顿的优化
-
布局优化
-
使用include、ViewStub、merge
-
不要出现过于嵌套和冗余的布局
-
使用自定义View取代复杂的View
-
ListView优化
-
复用convertView
-
滑动不加载
-
背景和图片优化
-
缩略图
-
图片压缩
-
避免ANR
-
不要在UI线程中做耗时操作
内存泄漏面试题
1、Java内存泄漏引起的主要原因
长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏
2、Java内存分配策略
-
静态存储区:又称方法区,主要存储全局变量和静态变量,在整个程序运行期间都存在
-
栈区:方法体的局部变量会在栈区创建空间,并在方法执行结束后会自动释放变量的空间和内存
-
堆区:保存动态产生的数据,如:new出来的对象和数组,在不使用的时候由Java回收器自动回收
3、Android解决内存泄漏的例子
-
单例造成的内存泄漏:在单例中,使用context.getApplicationContext()作为单例的context
-
匿名内部类造成的内存泄漏:由于非静态内部类持有匿名外部类的引用,必须将内部类设置为static
-
Handler造成的内存泄漏:使用static的Handler内部类,同时在实现内部类中持有Context的弱引用
-
避免使用static变量:由于static变量会跟Activity生命周期一致,当Activity退出后台被后台回收时,static变量是不安全,所以也要管理好static变量的生命周期
-
资源未关闭造成的内存泄漏:比如Socket、Broadcast、Cursor、Bitmap、ListView等,使用完后要关闭
-
AsyncTask造成的内存泄漏:由于非静态内部类持有匿名内部类的引用而造成内存泄漏,可以通过AsyncTask内部持有外部Activity的弱引用同时改为静态内部类或在onDestroy()中执行AsyncTask.cancel()进行修复
内存管理面试题
-
分配机制
-
管理机制
2、内存管理机制的特点
-
更少的占用内存
-
在合适的时候,合理的释放系统资源
-
在系统内存紧张的时候,能释放掉大部分不重要的资源
-
能合理的在特殊生命周期中,保存或还原重要数据
3、内存优化方法
-
Service完成任务后应停止它,或用IntentService(因为可以自动停止服务)代替Service
-
在UI不可见的时候,释放其UI资源
-
在系统内存紧张的时候,尽可能多的释放非重要资源
-
避免滥用Bitmap导致内存浪费
-
避免使用依赖注入框架
-
使用针对内存优化过的数据容器
-
使用ZIP对齐的APK
-
使用多进程
冷启动和热启动面试题
=============================================================
1、什么是冷启动和热启动
-
冷启动:在启动应用前,系统中没有该应用的任何进程信息
-
热启动:在启动应用时,在已有的进程上启动应用(用户使用返回键退出应用,然后马上又重新启动应用)
2、冷启动和热启动的区别
-
冷启动:创建Application后再创建和初始化MainActivity
-
热启动:创建和初始化MainActivity即可
3、冷启动时间的计算
这个时间值从应用启动(创建进程)开始计算,到完成视图的第一次绘制为止
4、冷启动流程
-
Zygote进程中fork创建出一个新的进程
-
创建和初始化Application类、创建MainActivity
-
inflate布局、当onCreate/onStart/onResume方法都走完
-
contentView的measure/layout/draw显示在界面上
总结:Application构造方法->attachBaseContext()->onCreate()->Activity构造方法->onCreate()->配置主题中背景等属性->onStart()->onResume()->测量布局绘制显示在界面上
5、冷启动优化
-
减少第一个界面onCreate()方法的工作量
-
不要让Application参与业务的操作
-
不要在Application进行耗时操作
-
不要以静态变量的方式在Application中保存数据
-
减少布局的复杂性和深度
-
不要在mainThread中加载资源
-
通过懒加载方式初始化第三方SDK
其他优化面试题
1、Android不用静态变量存储数据
-
静态变量等数据由于进程已经被杀死而被初始化
-
使用其他数据传输方式:文件/sp/contentProvider
2、SharePreference安全问题
-
不能跨进程同步
-
文件不宜过大
3、内存对象序列化
-
Serializeble:是java的序列化方式,Serializeble在序列化的时候会产生大量的临时对象,从而引起频繁的GC
-
Parcelable:是Android的序列化方式,且性能比Serializeble高,Parcelable不能使用在要将数据存储在硬盘上的情况
4、避免在UI线程中做繁重的操作
架构模式面试题
=============================================================
=============================================================
插件化面试题
-
动态加载APK(反射、类加载器)
-
资源加载(反射、AssetManager、独立资源、分段资源)
-
代码加载(反射获取生命周期)
2、类加载器(Java中字节码添加到虚拟机中)
-
DexClassLoader:能够加载未安装的jar/apk/dex,主要用于动态加载和代码热更新
-
PathClassLoader:只能加载系统中已经安装过的apk
热更新面试题
1、热更新主要流程
-
线上检查到Crash
-
拉出Bugfix分支修复Crash问题
-
jenkins构建和补丁生成
-
app通过推送或主动拉取补丁文件
-
将Bugfix代码合到master上
2、热更新主流框架
-
Dexposed
-
AndFix
-
Nuwa
-
Tinker
3、热更新的原理
-
在ClassLoader创建一个dexElements数组
-
将修复好的dex文件存放在dexElements数组的最前面
-
ClassLoader会遍历dexElements数组,找到最前面的dex文件优先加载
进程保活面试题
1、进程的优先级
-
空进程
-
后台进程
-
服务进程
-
可见进程
-
前台进程
2、Android进程回收策略
-
Low memory Killer(定时执行):通过一些比较复杂的评分机制,对进程进行打分,然后将分数高的进程判定为bad进程,杀死并释放内存
-
OOM_ODJ:判别进程的优先级
3、Android保活方案
-
利用系统广播拉活
-
利用系统Service机制拉活
-
利用Native进程拉活
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
![](https://img-blog.csdnimg.cn/img_convert/e54079d178ed30f030cec5fa95f9e6b8.jpeg)
面试复习笔记:
这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960页Android开发笔记》
《1307页Android开发面试宝典》
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-uA5bNW1B-1711618169188)]
[外链图片转存中…(img-6vHZE3K1-1711618169188)]
[外链图片转存中…(img-c2lsqOpR-1711618169189)]
[外链图片转存中…(img-8T0u44Ib-1711618169190)]
[外链图片转存中…(img-ht9mObPp-1711618169190)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
![](https://img-blog.csdnimg.cn/img_convert/e54079d178ed30f030cec5fa95f9e6b8.jpeg)
面试复习笔记:
这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960页Android开发笔记》
[外链图片转存中…(img-YcY85Gpv-1711618169190)]
《1307页Android开发面试宝典》
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
[外链图片转存中…(img-Yq1EbSCb-1711618169191)]
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。