安卓 每日一题 2020年4月问题及答案 转载
最新 文章连接,本文不再同步
Android4月1日题: 什么是代理模式
答:为其他对象提供一种代理以控制对这个对象的访问,它主要解决在直接访问对象时带来的问题, 比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象 创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或 者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层
Android4月2日题: 当两个对象的hashcode相同会发生什么?
答:如果是在存储阶段,两个对象如果作为key,他们的hashCode相同,就会引起hash 碰撞,面对hash碰撞,jdk1.7 采用的是链表来解决,相同的hashCode的对象会放到一个链表中,在链表中,通过对比对象本身和hashcode 是否都相同来判断是否是同一个节点,如果有不同,那么就不是同一个节点,如果相同,那就是同一个节点,而在jdk 1.8中采用的不是链表,而是采用红黑树来解决冲突。
Android4月3日题:ViewModel和AndroidViewModel区别是什么?
答:如果需要在viewmodel中使用上下文,则应使用AndroidViewModel,因为它包含应用程序上下文(以检索上下文调用getApplication()),否则使用常规ViewModel.
Android4月7日题:GC算法有哪些
答:标记-清除算法:一般为老年代的垃圾回收算法,效率高,但可能产生大量内存碎片
标记-整理算法:parallel old收集器与serial old收集器使用了此算法,解决了标记清除的内存碎片问题,但是效率低
复制算法:一般用于新生代的垃圾回收。会导致可用內存缩小;需要額外空间做分配担保(老年代)
Android4月8日题:LiveDataBus优点
答:LiveDataBus的实现及其简单,相对EventBus复杂的实现,LiveDataBus只需要一个类就可以实现
LiveDataBus可以减小APK包的大小
LiveDataBus只依赖Android官方组件LiveData,本身实现只一个类。EventBus 57Kb、RxJava 2.2M
LiveDataBus 依赖方支持更好
LiveDataBus只依赖Android官方组件LiveData,相比RxBus依赖的RxJava和RxAndroid,依赖方支持更好
LiveDataBus具有生命周期感知
Android4月9日题:什么是内存抖动?如何避免
答:非常频繁的创建与销毁对象。这可能会导致大量内存碎片的产生,同时GC频繁的工作会影响程序流畅性。所以需要避免在频繁调用的方法中new对象,同时也可以使用对象池来管理需要经常创建的小对象完成复用,如:Handler的message池
Android4月10日每日一题:讲下View的绘制流程?
答:View的工作流程主要是指measure、layout、draw这三大流程,即测量、布局和绘制,其中measure确定View的测量宽/高,layout确定View的最终宽/高和四个顶点的位置,而draw则将View绘制到屏幕上
View的绘制过程遵循如下几步:
绘制背景 background.draw(canvas)
绘制自己(onDraw)
绘制 children(dispatchDraw)
绘制装饰(onDrawScollBars)
Android4月13日题:MotionEvent是什么?包含几种事件?什么条件下会产生?
答:MotionEvent是手指接触屏幕后所产生的一系列事件。典型的事件类型有如下:ACTION_DOWN:手指刚接触屏幕
ACTION_MOVE:手指在屏幕上移动
ACTION_UP:手指从屏幕上松开的一瞬间
ACTION_CANCELL:手指保持按下操作,并从当前控件转移到外层控件时触发
正常情况下,一次手指触摸屏幕的行为会触发一系列点击事件,考虑如下几种情况:点击屏幕后松开,事件序列:DOWN→UP
点击屏幕滑动一会再松开,事件序列为DOWN→MOVE→…→MOVE→UP
Android4月14日题:(灵魂拷问)你的职业发展之路是怎样的?未来有什么打算吗?(开放性问题,说出你的想法)
参考:Android开发的职业发展路径,基本上有两条:技术专精路线和技术转产品路线。
1、技术为王。晋升轨迹:Android初级开发程序员—中级—高级–软件架构师–系统架构师–项目经理–首席技术官
2、由技术向产品方向转型。晋升轨迹:Android初级开发程序员—中级—高级–软件架构师–系统架构师–产品经理–产品总监
其实还有第三条路线,就是自己创业,但不管哪个方向,对自己的未来提前客观的做出职业发展规划是有必要的,还是那就老话,机会是留给有准备的人的。
最后,希望每个人都有一个好的职业生涯,祝最后梦想都实现~
(很多人会说这个东西还有答案呀,在这里说一下这个并非是答案,只是一个大佬给予的参考)
Android4月15日题:如何解决View的事件冲突 ?举个开发中遇到的例子 ?
参考答案:
常见开发中事件冲突的有ScrollView与RecyclerView的滑动冲突、RecyclerView内嵌同时滑动同一方向
滑动冲突的处理规则:对于由于外部滑动和内部滑动方向不一致导致的滑动冲突,可以根据滑动的方向判断谁来拦截事件。
对于由于外部滑动方向和内部滑动方向一致导致的滑动冲突,可以根据业务需求,规定何时让外部View拦截事件,何时由内部View拦截事件。
对于上面两种情况的嵌套,相对复杂,可同样根据需求在业务上找到突破点。
滑动冲突的实现方法:外部拦截法:指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,否则就不拦截。具体方法:需要重写父容器的onInterceptTouchEvent方法,在内部做出相应的拦截。
内部拦截法:指父容器不拦截任何事件,而将所有的事件都传递给子容器,如果子容器需要此事件就直接消耗,否则就交由父容器进行处理。具体方法:需要配合requestDisallowInterceptTouchEvent方法
Android4月16日题:Jni静态注册的弊端是什么
参考答案:
1.编写不方便,JNI 方法名字必须遵循规则且名字很长;
2.编写过程步骤多,不方便;
3.程序运行效率低,因为初次调用native函数时需要根据根据函数名在JNI层中搜索对应的本地函数,然后建立对应关系,这个过程比较耗时;
Android4月17日题:您在项目开发中使用的屏幕适配方案是什么样的?
参考答案:
1.使用dimens
2.使用谷歌的自动布局或百分比布局
3.自定义适配布局文件
4.对于手机与平板的适配,使用Layout目录
5.切入源码层实现
Android4月20日题:isAssignableFrom 与 instanceof 的区别
参考答案:
isAssignableFrom是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或接口。
instanceof是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。
Android4月21日题:Butterknife和GsonFormat这类代码自动生成是如何实现的?
答:需要使用AS插件开发技术
1.在Intellij中新建项目
2.新建Action以设置菜单
3.在Action关联的类中进行功能开发开发完成生成对应的插件包
Android4月22日题:自定义View有哪几种?
答:1、自定义组合控件
多个控件组合成为一个新的控件,方便多处复用
2、继承系统View控件
继承自TextView等系统控件,在系统控件的基础功能上进行扩展
3、继承View
不复用系统控件逻辑,继承View进行功能定义
4、继承系统ViewGroup
继承自LinearLayout等系统控件,在系统控件的基础功能上进行扩展
5、继承ViewViewGroup
不复用系统控件逻辑,继承ViewGroup进行功能定义
Android4月23日题:v3签名key和v2还有v1有什么区别
答:在v1版本的签名中,签名以文件的形式存在于apk包中,这个版本的apk包就是一个标准的zip包,V2和V1的差别是V2是对整个zip包进行签名,而且在zip包中增加了一个apk signature block,里面保存签名信息。
v2版本签名块(APK Signing Block)本身又主要分成三部分:
SignerData(签名者数据):主要包括签名者的证书,整个APK完整性校验hash,以及一些必要信息
Signature(签名):开发者对SignerData部分数据的签名数据
PublicKey(公钥):用于验签的公钥数据
v3版本签名块也分成同样的三部分,与v2不同的是在SignerData部分,v3新增了attr块,其中是由更小的level块组成。每个level块中可以存储一个证书信息。前一个level块证书验证下一个level证书,以此类推。最后一个level块的证书,要符合SignerData中本身的证书,即用来签名整个APK的公钥所属于的证书
Android4月24日题:弱引用应用场景
参考答案:1. 如果一个对象是偶尔的使用,并且希望在使用时随时就能获取到,但又不想响此对象的垃圾收集,那么应该用 Weak Reference 来记住此对象。
- 想引用一个对象,但是这个对象有自己的生命周期,你不想介入这个对象的生命周期,这时候就应该用弱引用,这个引用不会在对象的垃圾回收判断中产生任何附加的影响。
Android4月27日题:JVM运行时数据区栈区中的栈帧主要由哪些部份组成?它们的作用分别是?
参考答案:
1.局部变量表
用于存放八大基本数据类型和对象的引用
2.操作数栈
存放操作数的一块临时空间
3.动态链接
存放编译时不能确定方法入口的方法的地址
需要在运行时来保证方法调用的正确性
4.方法出口(返回地址)
Android4月28日题:你知道观察者设计模式和 发布订阅设计模式的区别吗?
参考答案:
表面上看:
1、观察者模式中,两个角色:观察者和被观察者
2、发布订阅模式中,三个角色:发布者,订阅者,经纪人
深层次的看:
1、观察者模式:观察者和被观察者,是松耦合的关系
2、发布订阅模式:发布和订阅者是完全不存在耦合的
从使用层面上看:
1、观察者模式:多用于单个应用内部,维护的是单一事件对应多个依赖的
event -> [obj1,obj2,obj3,…]
2、发布订阅模式:多用于跨应用的模式,比如我们说的消息的中间件,维护的是多个事件以及依赖的
event1 -> [obj1,obj2,…] event2 -> [obj1,obj3,…]
Android4月29日题:请简述 retrofit 中,一个方法的执行流程
参考答案:
首先我们通过我们 create 出来的 retrofit 实例来调用接口方法。所有的 interface 方法都会在 java 动态代理机制的作用下,调用一个匿名类 new InvocationHandler 中的 invoke。在 invoke 中,会根据我们想调用的方法 method 构造出一个 serviceMethod,然后调用 serviceMethod.callAdapter.adapt(okHttpCall) 作为返回结果。
构造 serviceMethod 的时候,会根据 interface 中 method 的的返回类型,构造出 converter 和 callAdapter。其中, converter 一般使用 gson converter。gson converter 可以自动将服务器返回的 json 数据转化成 java 中的 model 类的实例。callAdapter 绝大多数的实现方式是在构造函数中接收一个 okHttpCall 实例,然后将 enqueue 和 execute 委托给这个 okHttpCall 实例来执行。okHttpCall 在获取到服务器数据之后,会利用 serviceMethod.toResponse(body) 来对数据进行转化。其中,转化的时候便利用了 converter。数据转化完成后,封装成 Response ,传递给调用方。其中 R 就是我们的数据类。
Android4月30日题:AOP实际常见的场景有哪些?
参考答案:
统计埋点
日志打印
数据校验
行为拦截
性能监控
动态权限申请
转载自 安卓2020年4月每日一题
本文来自博客园,作者:清霜辰,转载请注明原文链接:https://www.cnblogs.com/cnjim/p/18443485
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了