2024年 Android面试知识点总结 (备战金三银四面试季),已开源

map:将一种数据源,转化成另外一种

flatmap:将一种数据源,转化成另外一种数据,并且被转化的数据是乱序排列的

concatmap:将一种数据源,转化成另外一种数据,并且被转化的数据是按照先前的数据源顺序排序的

toList:将数组的形式转化成List集合

subscribeOn:设置Observable的call方法所在的线程,也就是数据来源的线程

observeOn:设置subscribe的call方法所在的线程,也就是数据处理的线程

filter:在被观察者的数据层过滤数据

onErrorResumeNext:出错的时候,可以指定出错的时候的被观察者

retryWhen:出错的时候,重新走一遍被订阅的过程

concat:合并相同类型的被观察者到一个被观察者身上,有点类似集合、数组拼接数据。

zip:处理多种不同结果集的数据发射,一般用得多的地方是多个网络请求组合然后统一处理业务逻辑。

还有很多操作符就自己去看,这些操作符已经够面试用的了。

线程锁 锁方法和类对象啥的有啥区别

线程锁锁方法:是需要等到该线程用完了该方法才能释放同步锁

线程锁锁类对象:是需要等到该线程用完了该类对象才能释放同步锁

区别:是锁方法的区域要小 锁类对象包括了该类的所有属性

AsyncTask原理

AsyncTask主要是对android中java的线程池的封装,该类中默认开启了两个线程池,一个线程池负责任务的排队处理,保证任务被单个处理,另外一个线程池用来专门处理任务,最后任务处理完了,交给Handler发送消息到主线程,然后Handler处理线程,交给了onPostExecute方法。

内部过程:

  • AsyncTask初始化阶段创建了WorkerRunnable对象,它是处理doInBackground的Callable对象,接着创建了FutureTask对象,它是将上面WorkerRunnable包装了一层的RunnableFuture对象,实际上线程池要执行的任务就是该WorkerRunnable对象。

  • 在执行任务过程中,通过SerialExecutor对象来排队处理FutureTask,里面通过ArrayDeque来按顺序取出FutureTask,取出后交给了THREAD_POOL_EXECUTOR对象,它是在静态代码块中创建的线程池,所以说THREAD_POOL_EXECUTOR才是正真执行任务的关键地方。

  • 执行完后,剩下的就是主线程的Handler将消息发送到主线程去处理。

问题:

  • AsyncTask内部会创建一个线程池?

两个线程池,一个线程池负责排队处理任务;另一个线程池用来负责处理FutureTask,也就是将上面WorkerRunnable包装了一层的Runnable对象。

  • AsyncTask对此执行excute方法会怎样?

直接抛出IllegalStateException(非法状态异常)

说说MVP和MVVM的特点

MVP:主要是分离了M层和V层的代码,通过P层来建立他们的关联,实现M层和V层的解耦。缺点就是每增加一个功能,需要增加相应的接口回调。没办法,MVP的核心就是通过接口实现隔离,将相关的业务层交给了P层。

如果要细说mvp需要注意几点:

  • p层的逻辑处理单一的功能,不要融合一个模块下的增删改查的整个功能。

  • 由于p层持有了v层的引用,通常在p层使用弱引用来持有view层实例,在p层销毁的时候需要将v层的引用销毁掉。

  • 契合类指的p层和v层的接口类放在一个contract接口类中,契合类方便管理业务层的功能,将单个功能放到一个contract契合类中。比如我们有一个添加书架的功能:

public interface AddBookShelfContract {

interface View extends BaseContract.BaseView {

void addBookShelfSuccess(BookShelfItem… bookShelfItem);

void addBookShelfFail();

void alreadyBookShelf(BookShelfItem bookShelfItem);

}

interface Presenter extends BaseContract.BasePresenter {

void addBookShelf(String tokenId, BookShelfItem… bookShelfItem);

}

}

MVVM:主要是用到了观察者模式,通过数据的改变来通知相应的View改变的过程。M层和上面的MVP中的M层是一样的,都是网络请求+数据缓存来实现该层的,里面的双V,一个指的ViewModel实现的,另外一个AndroidDataBinding实现V层,ViewModel层获取到M层的数据后,通过观察者模式通知AndroidDataBinding在UI上的改变。缺点的话,只能吐糟下AndroidDataBinding了,在xml中写逻辑的时候,一点提示代码都没有,感觉完全是在写js似的,可读性肯定对于初级的来说还是有点难看懂的。

Android中用到的观察者模式有哪些地方

观察者模式是由一个发送者(发送者是笔者自己的称呼,觉较之被观察者贴切得多)和一个观察者构成的、发送者在状态改变时(用户操作、程序主动改变等)主动通知所有观察者作相应的刷新。

android中最经典要说ListView的数据源发生变化了,刷新列表的事例。在setAdapter的时候,生成一个AdapterDataSetObserver,紧接着就是订阅上该观察者,该观察者onChange方法里面有requestLayout方法,该方法是触发UI发生变化的方法。在BaseAdapter里面可以看到notifyDataSetChanged实际上触发的是DataSetObservable被观察者的notifyChanged方法,notifyChanged会触发AdapterDataSetObserveronChange方法。所以最终会走listView的requestLayout,最后刷新了UI。

说说Google新出的Lifecycle框架

将类的生命周期方法移交到Lifecycle中管理,实现对类的生命周期的监听,从而在Lifecycle中处理生命周期的逻辑代码。这里涉及到几个对象:

LifecycleObserver接口( Lifecycle观察者):实现该接口的类,通过注解的方式,可以通过被LifecycleOwner类的addObserver(LifecycleObserver o)方法注册,被注册后,LifecycleObserver便可以观察到LifecycleOwner的生命周期事件。

LifecycleOwner接口(Lifecycle持有者):实现该接口的类持有生命周期(Lifecycle对象),该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。

Lifecycle(生命周期):和LifecycleOwner不同的是,LifecycleOwner本身持有Lifecycle对象,LifecycleOwner通过其Lifecycle getLifecycle()的接口获取内部Lifecycle对象。

State(当前生命周期所处状态):几种事件状态。

Event(当前生命周期改变对应的事件):当Lifecycle发生改变,事件状态的回调event。

OKhttp原理

okhttp主要实现了异步、同步的网络操作,创建了不同的call对象,这里的call对象是一个个的runnable对象,由于我们的任务是很多的,因此这里有Dispatcher包装了线程池来处理不同的call,其中该类中创建了三种队列,分别用于存放正在执行的异步任务,同步队列,以及准备的队列。最后在执行每个任务的时候,采用队列的先进先出原则,处理每一个任务,都是交给了后面的各种拦截器来处理,有请求准备的拦截器、缓存拦截器、网络连接的拦截器,每一个拦截器组成了一个责任链的形式。到最后返回response信息。

OkHttp的底层是通过Java的Socket发送HTTP请求与接受响应的(这也好理解,HTTP就是基于TCP协议的),但是OkHttp实现了连接池的概念,即对于同一主机的多个请求,其实可以公用一个Socket连接,而不是每次发送完HTTP请求就关闭底层的Socket,这样就实现了连接池的概念。而OkHttp对Socket的读写操作使用的OkIo库进行了一层封装。

Retrofit原理

retrofit基于okHttp封装成RESTFUL网络请求框架,通过工厂模式配置各种参数,通过动态代理、注解实现网络请求。retrofit利用了工厂模式,将分为生产网络请求执行器(callFactory)、回调方法执行器(callbackExecutor)、网络请求适配器(CallAdapterFactory)、数据转换器(converterFactory)等几种工厂。

callFactory负责生产okHttp的call,大家都知道okHttp通过生成call对象完成同步和异步的http请求。

callbackExecutor通过判断不同的平台,生成对应平台的数据回调执行器。其中android端的回调执行器是通过handler回调数据。

CallAdapterFactory是数据解析工厂,一般我们配置json的数据解析适配器就行。

converterFactory是数据转换的工厂,一般我们配置Rxjava的数据转换就行。

retrofit通过动态代理模式实现接口类配置的注解、参数解析成HTTP对象,最后通过okHttp实现网络请求。

RxJava 的线程切换原理

  • RxJava通过subscribeOn指定被观察者发生的线程,observeOn指定观察者发生的线程。其中Schedulers.IO生成的是IoScheduler。通过观察者与被观察者订阅的过程中,首先会触发被观察者的subscribeActual方法,在该方法中,可以看到最终会走schedulerschedule方法,所以上面提到的IoScheduler实际是调用了它的schedule方法,最终会在NewThreadWorker里面生成ScheduledExecutorService对象,而ScheduledExecutorService实际是由ScheduledThreadPoolExecutor创建的一个核心线程,最大线程个数是Integer.MAX_VALUE的线程池。最终会由ScheduledThreadPoolExecutorsubmitschedule方法执行传过来的Runnable对象,而Runnable执行的是被观察者的subscribe方法。所以解释了被观察者的subscribe方法是在子线程中执行的。

  • observeOn是观察者发生的线程,AndroidSchedulers.mainThread()实质是HandlerScheduler对象,而在观察者部分,最终观察部分会走SchedulerscheduleDirect方法,而HandlerScheduler的该方法里面包装了一个ScheduledRunnable对象,通过主线程的handler.postDelayed处理这个runnable对象。

RecyclerView源码、缓存分析

RecyclerView使用了强大的分工操作,显示、排版由LayoutManager处理,数据显示由adapter处理,item上下左右动态加入绘制由ItemDecoration处理,item的动画由ItemAnimator处理。面试主要分析recyclerView缓存,recyclerView缓存是由内部类Recycler维护,其中一级缓存有mAttachedScrap,里面放的都是当前屏幕正在显示的viewHolder的缓存,二级缓存是mCachedViews,里面放的都是移出到屏幕外的viewHolder缓存,mRecyclerPool是recyclerView的三级缓存,一般用在RecyclerView嵌套RecyclerView的时候用得到,比如外层的RecyclerView的item中有RecyclerView,那么里面的RecyclerView通过共用外层的RecyclerView的RecyclerPool来减少里面RecyclerView的ViewHolder创建。

Binder机制

binder机制是android端进程间通信的基石,采用aidl的ipc通信方式,我们可以利用它来定义两个进程相互通信的接口。他是基于Service实现的一种线程间通信机制。它的本质是C/S架构的,需要一个服务器端,一个客户端。 AIDL通信方式里面有四个对象,一个是IInterface,专门用来负责接口的调度,Stub用来负责通信的响应和发送给service端的数据,Proxy负责两个进程通信的包装,算是间接调用Stub的包装类,service是服务端处理数据的关键类。用一张图来表示如下:

Android Jetpack

android jetpack是google专门为开发者快速开发app的一套组件,快速搭建mvvm框架的实现,其中包括Lifecyle、LiveData、ViewModel、Room、DadaBinding、Navigation、Paging、WorkManager等一系列优秀的框架。

Lifecycle:实现和activity、fragment生命周期感知的框架,实现数据层和view层销毁的时候解绑。原理是Lifecycler为每个活动组件添加了一个没有界面的Fragment,利用Fragment周期会根据活动声明周期变化的特性实现的特性,从而实现生命周期的感知,然后根据注解的Event查找执行相应的方法。

LiveData:提供了一种数据改变的同时,主动去告诉ui,让ui层做出相应的逻辑判断。原理是内部保存了LifecycleOwner和Observer,利用LifecycleOwner感知并处理声明中期的变化,Observer在数据改变时遍历所有观察者并回调方法。

ViewModel:它是我们view层和model层的桥梁,是数据驱动界面的关键地方,也是我们ui层在数据丢失的情况下,viewModel还能继续保持原有的数据,原理是将数据保存到ViewModel中,然后为活动中添加一个HolderFragment,HolderFragment中保存了ViewStore的实例,ViewStore中使用Map保存了ViewModel,从而在活动重新创建时获取到原来的ViewModel。

Room:是model层本地数据库的框架,通过实体映射到对应的db表结构,将实体映射到db关系型数据库里面。跟greendao差不多,room数据库版本升级数据迁移比greendao迁移要麻烦,个人还是比较喜欢greendao来实现本地数据库。 DadaBinding:是一个可以通过在xml布局文件中实现ui逻辑的框架,并且它的ui层和数据层双向驱动还是挺不错的。

Navigation:是后面新出来的可视化管理fragment的组件,通过在xml中配置fragment之间跳转的关系。

系统打包经过了哪几个流程

  • 打包资源文件,通过AAPT(Android Asset Packaging Tool)打包成R.java类(资源索引表)以及.arsc资源文件。

  • 处理AIDL文件,检查app中是否有aidl文件,如果有会通过aidl工具(源码位于system/tools/aidl)打包成java接口类

  • 编译R.java源码部分以及aidl.java通过javac生成对应的.class文件。

  • 将上面生成的.class文件和第三方jar或者library通过dx工具打包生成dex文件。

  • 生成未签名的apk,包括apkbuilder工具将所有没有编译的资源、.arsc资源、.dex文件打包到一个完成apk文件中

  • 生成签名的apk,包括jarsigner工具对未签名的apk验证签名。得到一个签名后的apk(signed.apk)

  • zipAlign工具对齐上面签名的apk文件。

Kotlin

kotlin使用了一组新的语法糖,kotlin不让变量初始化空的类型,强大的非空设计思想比java要人性化,在代码编写阶段就有提示开发者的好处。还有它的内联函数,函数体作为返回值的各种简写方式使更多的人愿意接受kotlin。它的协成开发比较好的控制线程之间切换的多层嵌套的问题,以及它简洁的语法,比较受开发者青睐。

好了,大概Android面试的Android篇就写这么多。如果大家觉得还有那些要补上可以留言我!!!

最后

在这里小编分享一份之前在网上查找收集的往年常见面试题,整理成了一些文档。希望能够对大家有所帮助,在面试中能顺利通过。如果需要的话可以点击【GitHub】获取!!!

喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗😜😜😜~

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

总而言之,Android开发行业变化太快,作为技术人员就要保持终生学习的态度,让学习力成为核心竞争力,所谓“活到老学到老”只有不断的学习,不断的提升自己,才能跟紧行业的步伐,才能不被时代所淘汰。

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

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

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

[外链图片转存中…(img-8MxATIPd-1711608977884)]

[外链图片转存中…(img-Aw1pAFT5-1711608977884)]

[外链图片转存中…(img-acmaACOp-1711608977884)]

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

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值