安卓 每日一题 2020年2月问题及答案

最新 文章连接,本文不再同步

Android 2月2日题:android图片占用的内存大小怎么计算?

答案:分辨率像素点大小。但是分辨率不一定是原图分辨率,而像素点一般就ARGB_8888(4字节)与RGB_565(2字节)。android系统会根据图片不同来源决定加载图片的分辨率。图片来自res,则分辨率=原图横向分辨率(设备dpi/目录对于dpi)原图纵向分辨率(设备dpi/目录对于dpi);图片来自磁盘、文件等,按照原图分辨率加载。


Android 2月3日题:android创建多线程方式

答案:Handler+Thread、AsyncTask、ThreadPoolExecutor、IntentService


Android 2月4日题:hashmap怎么处理hash碰撞?

答案:hashmap利用“拉链法”处理HashCode的碰撞问题;将键值对传递给put方法时,他调用键对象的hashCode()方法来计算hashCode,然后找到bucket(哈希桶)位置来存储对象;当用get方法获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当碰撞发生了,对象将会存储在链表的下一个节点中。hashMap在每个链表节点存储键值对对象。当两个不同的键却有相同的hashCode时,他们会存储在同一个bucket位置的链表中。键对象的equals()来找到键值对。


Android 2月5日题:插件化和热修复区别

答案:插件化顾名思义,更多是想把需要实现的模块或功能当做一个独立的提取出来,减少宿主的规模,当需要使用到相应的功能时再去加载相应的模块。热修复则是从修复bug的角度出发,强调的是在不需要二次安装应用的前提下修复已知的bug。


Android 2月6日题:一个Thread可以有几个Looper?几个Handler?

答案:由于使用了ThreadLocal机制,所以注定了一个线程只能有一个Looper,但Handler可以new无数个。


Android 2月8日题:你了解重新调整HashMap大小存在什么问题吗?

答案:当hashMap中的节点数超过阈值的时候,就会自动扩容,扩容的时候就会调整hashMap的大小,一旦调整了hashMap的大小就会导致之前的hashCode计算出来的hash表中下标无效,所以所有的节点都需要重新hash运算,结果就是带来时间上的浪费。因此我们要尽量避免hashMap调整大小,所以我们使用hashMap的时候要给hashMap设置一个默认值,这个默认值要大于我们hashMap中存放的节点数。
默认16,扩容因子0.75,即当发生碰撞且数目大于16*0.75时发生扩容


Android 2月9日题:你用过HashMap吗?什么是HashMap?你为什么用到它?

答案:HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象


Android 2月10日题:Message可以如何创建,哪种效果最好?为什么?

答案: 一共有3种方法:Messagemessage = Message.obtain(); Message message = handler.obtainMessage(); Messagemessage = new Message();需要说明的是:前两种都是从消息池中返回一个新的实例,能有效避免重复创建Message,因为Message内部采用了享元设计模式,避免了因为反复new Message而带来的内存抖动。


Android 2月11日题:谈谈你对 JNI 和 NDK 的理解

答案:JNI 是Java Native Interface的缩写,即 Java 的本地接口。JNI存在的目的就是作为一个翻译语言,用于java和C/C++进行相互调用,也就是说,JNI和Android没有直接关系,而是和java语言有关系

NDK:NDK 是Native Development Kit的缩写,是 Android 的工具开发包。作用是更方便和快速开发 C/C++ 的动态库,并自动将动态库与应用一起打包到 apk。也就是,我们可以通过JNI接口来写C/C++的代码,然后又用C/C++代码来调用动态库(.so)来实现Android中需要大量物理模型运算的功能。NDK 是属于 Android 的,与 Java 无直接关系。


Android 2月13题:主线程中的Looper的轮询死循环为何没有阻塞主线程

答案:因为Android 的是由事件驱动的,looper.loop() 不断地接收事件、处理事件,每一个点击触摸或者说Activity的生命周期都是运行在 Looper.loop() 的控制之下,如果它停止了,应用也就停止了。只能是某一个消息或者说对消息的处理阻塞了 Looper.loop(),而不是 Looper.loop() 阻塞它。


Android 2月14题:可以在子线程直接new一个Handler吗?怎么做?

答案:首先, 如果是创建子线程的Handler, 需要三步:Looper.prepare(); Handler handler = newHandler(); Looper.loop();因为子线程的handler需要准备looper,同时要启动Looper.loop(),只有这样handler的机制才能够正常运行。

其次,如果是创建主线程中的Handler,那就需要这样处理:Handler mainHandler = new Handler(Looper.getMainLooper());


Android 2月15题:View中getwidth和getMeasuredWidth的值的区别是什么?

答案:getWidth()方法是需要在View中调用了onLayout之后才能执行,否则得到的结果会是错误的,表示的是view显示后的宽度。而getMeasuredWidth方法是获取的执行了onMeasure之后的就能获取到值,表示的是度量后的view的宽度。


Android 2月17题:常见的屏幕适配方案有哪些?

答案:使用dimens使用谷歌的自动布局或百分比布局

自定义适配布局文件

对于手机与平板的适配,使用Layout目录


Android 2月19题:java中自定义注解的元注解有哪些?

答案:1.@Retention: 定义注解的保留策略

2.@Target:定义注解的作用目标

3.@Document:说明该注解将被包含在javadoc中

4.@Inherited:说明子类可以继承父类中的该注解


Android 2月20题:JetPack中是如何监听Activity生命周期?

答案:可以使用Lifecycles组件去感知Activity的生命周期

Activity因为已经实现了LifecycleOwner接口,能直接作为被观察者,所以可以直接在上面添加观察者,观察者类实现LifecycleObserver接口,以实现对Activity生命周期的监听。


Android 2月21题:为什么String, Interger这样的wrapper类适合作为键?

答案:第一个是习惯,我们习惯用String和Interger代表一个变量的id。第二个原因是,String 和Interger已经自己实现了equals方法,和hashcode方法,这两个方法是做键key 必须要实现的方法


Android 2月22题:Dagger2中的Singleton与Scope注解你是如何理解的?

答案:表示单例,Scope的特殊衍生注解,作为Scope的一种模版形式,尽量不直接使用。

Scope注解,可用来限定通过Module和Inject方式创建实例的生命周期能够与目标类的生命周期相同,其实就是起到一个提醒和管理的作用。


Android 2月24题:MVVM架构中databinding的作用是?

答案:Databinding用于在VIEW层与MODEL层之间实现UI与数据的双向邦定功能。


Android 2月25题:JNI 线程间数据怎么互相访问

答案:了解这个问题首先要知道JNI 中全局引用和局部引用的区别:全局引用能在多个线程中被使用,且不会被 GC 回收,只能手动释放。局部引用只在创建它的 native 方法中有效,包括其调用的其它函数中有效。因此我们不能寄望于将一个局部引用直接保存在全局变量中下次使用(请使用全局引用实现该需求)。因此,JNI线程间数据相互访问需要使用全局引用来实现。


Android 2月26题:什么是MeasureSpec?

答案:一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。一个MeasureSpec由大小和模式组成。它有三种模式:UNSPECIFIED(未指定),父元素不对自元素施加任何束缚,子元素可以得到任意想要的大小;EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;AT_MOST(至多),子元素至多达到指定大小的值。


Android 2月27题:ViewPager缓存机制是怎样的?

答案:ViewPager内部维持了一个ArrayList,这个list用于缓存VIewPager需要显示的页面,默认情况下ViewPager会缓存两帧页面,显示一帧页面。缓存是ViewPager的一个最大的特点,缓存是在populate函数中进行的,这个函数全程掌握着adapter来适配显示页面。


Android 2月28题:我们可以使用CocurrentHashMap来代替Hashtable吗?

答案:Hashtable和ConcurrentHashMap有什么分别呢?它们都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。因为ConcurrentHashMap引入了分割(segmentation),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map。简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map。


Android 2月29题:什么是hook技术?

答案:用反射和动态代理来调用Android源码,通过反射Android源码从而修改代码的执行流程,就像是一个钩子一样。Hook技术的难点在于找到一个合适的hook点,所以需要对源码非常了解,深入调查,很小心才可以。


转载自安卓2020年2月每日一题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值