Android 3.29面试题
1. 实体类中使用set/get与直接调用变量相比有什么区别,有哪些好处?
- a.set/get比较灵活
- b.set/get安全性(只读或只写的权限)
- c.get方法是给私有成员变量取值的,set方法是赋值的,而成员变量的值只能在本类中被使用
2. 线程的sleep()和wait()有什么区别,举两个简单的使用场景。
它们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁.
还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;
wait()可以用notify()直接唤起. sleep和wait的区别还有:
1、这两个方法来自不同的类分别是Thread和Object
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用, 而sleep可以在 任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
3. 字节流和字符流使用场景的区别。
InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象, Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串. 字符流处理的单元为2个字节的Unicode字符,操作字符、字符数组或字符串, 字节流处理单元为1个字节,操作字节和字节数组。 所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的, 所以它对多国语言支持性比较好! 如果是音频文件、图片、歌曲,就用字节流好点, 如果是关系到中文(文本)的,用字符流好点
1.字节流在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
2.在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成。
4. ConcurrentHash如何做到高效且线程安全的?
- ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。
- 从ConcurrentHashMap代码中可以看出,它引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。
5. 列出造成内存泄露的原因,并给我解决方案
内存溢出的原因以及解决方法
引起内存溢出的原因有很多种,小编列举一下常见的有以下几种:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 3.代码中存在死循环或循环产生过多重复的对象实体; 4.使用的第三方软件中的BUG; 5.启动参数内存值设定的过小
内存溢出的解决方案:
第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
6. 请尽可能详细描述自定义view的步骤
- 1、创建View,继承现有View
- 2、定义自定义属性,获取自定义属性并使用
- 3、测量View
- 4、绘制View
- 5、使用已定义的View
7. 界面在栈下部被系统回收后,返回此界面的时候如何恢复数据?
重写onSaveInstanceState()方法,在此方法中保存需要保存的数据,该方法将会在activity被回收之前调用。通过重写onRestoreInstanceState()方法中提取保存好的数据。
8. 开发过程中如何快速的定位造成UI卡顿的原因?
下面总结一些常见的UI卡顿原因:
一、外部因素引起的(以View为区分)
-
内存抖动的问题
-
方法太耗时了(CPU占用)
二、View本身的卡顿
Android使用消息机制进行UI更新的,如果在主线程handler的dispatchMessage方法进行了耗时操作,就会发生UI卡顿。
9. 了解哪些热更新框架?大致描述一种或多种安卓热更新的实现方式。
10.Android 线程间通信有哪几种方式**
1)共享变量(内存)
2)管道
3)handle机制
- runOnUiThread(Runnable)
- view.post(Runnable)
11.Devik 进程,linux 进程,线程的区别**
Dalvik进程。
每一个android app都会独立占用一个dvm虚拟机,运行在linux系统中。
所以dalvik进程和linux进程是可以理解为一个概念。
12.描述一下 android 的系统架构**
从小到上就是:
linux kernel,lib dalvik vm ,application framework, app
13.android 应用对内存是如何限制的?我们应该如何合理使用内存?**
activitymanager.getMemoryClass() 获取内存限制。
关于合理使用内存,其实就是避免OOM & 内存泄露中已经说明。
14. 简述 android 应用程序结构是哪些**
1)main code
2)unit test
3)mianifest
4)res->drawable,drawable-xxhdpi,layout,value,mipmap
mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术.
google建议只把启动图片放入
5)lib
6)color
15.请解释下 Android 程序运行时权限与文件系统权限的区别
- 文件的系统权限是由linux系统规定的,只读,读写等。
- 运行时权限,是对于某个系统上的app的访问权限,允许,拒绝,询问。该功能可以防止非法的程序访问敏感的信息。
16.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么
Framework是android 系统对 linux kernel,lib库等封装,提供WMS,AMS,bind机制,handler-message机制等方式,供app使用。
简单来说framework就是提供app生存的环境。
1)Activity在attch方法的时候,会创建一个phonewindow(window的子类)
2)onCreate中的setContentView方法,会创建DecorView
3)DecorView 的addview方法,会把layout中的布局加载进来。
17.多线程间通信和多进程之间通信有什么不同,分别怎么实现**
线程间的通信可以参考第6点。
进程间的通信:bind机制(IPC->AIDL),linux级共享内存,boradcast,
Activity 之间,activity & serview之间的通信,无论他们是否在一个进程内。
18.Android 屏幕适配**
屏幕适配的方式:xxxdpi, wrap_content,match_parent. 获取屏幕大小,做处理。
dp来适配屏幕,sp来确定字体大小
drawable-xxdpi, values-1280*1920等 这些就是资源的适配。
wrap_content,match_parent, 这些是view的自适应
weight,这是权重的适配。
19.什么是 AIDL 以及如何使用**
Android Interface Definition Language
AIDL是使用bind机制来工作。
参数:
java原生参数
String
parcelable
list & map 元素 需要支持AIDL
20.如何修改 Activity 进入和退出动画**
overridePendingTransition
21.SurfaceView & View 的区别
view的更新必须在UI thread中进行
surfaceview会单独有一个线程做ui的更新。
surfaceview 支持open GL绘制。
22、 什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?
答:程序出现异常,比如nullpointer。
避免:编写程序时逻辑连贯,思维缜密。能捕获异常,在logcat中能看到异常信息