Android面试题一
2016-06-01 09:15
465 查看
Android面试题
Android中有哪几种解析XML的类,官方推荐的是哪种?,以及他们的原理和区别?
在Android平台上可以使用SAX(SimpleAPI For XML),DOM(DocumentObjectModel),以及Android自带的PUll解析器解析。SAX解析 文件采用的是事件驱动,也就是说,他读取单线并不需要解析完整的文档,在按内容顺序解析文档的过程中,SAX会判断挡墙读取到的字符是否符合XML语法中的某个部分,如果符合就会触发事件,其实就是一些回调方法,然后进行判断处理。优点 :解析速度快,占用内存小,适用于Android等移动设备。缺点对于嵌套多个分支来说处理不是很方便。
DOM解析 解析文件时会将XML文件的所有内容以文档树的方式存放在内存中,然后使用DOMAPI遍历XML树,检索所需要的数据,主要用PC机。 优点 : 使用DOM解析XML的代码比较直观,基于SAX的实现更加简单,缺点 :需要将整个XML文件的所有内容放在内存中,消耗内存大,不适用Android等移动设备。
Pull解析 是Android内置解析XML文件的一个解析器,运行方式类似于SAX解析,只是产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。Pull解析对节点处理比剑豪,同样也很省内存,官方推荐使用Pull解析器解析XML文件,而且Android系统本身也用到XML文件,内部也是使用PUll解析器进行解析的。
DDMS与TraceView的区别
DDMS是一个程序执行查看器,在里面可以看见线程堆栈等信息,TraceView是程序性能分析器。可以参考文章http://blog.jobbole.com/78995/详细的对TraceView进行了解析。ListView的优化方案
如果自定义适配器,那么在getView方法中要考虑方法传进来的参数,contentView是否为null,如果为努力了就创建contentView并返回,如果不为null则直接使用,在这个方法中尽可能少创建View。给contentView设置tag,传入一个ViewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果。
如果ListView需要显示的item很多,就考虑分页加载,比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候,再去加载接下来的20条。
快速滑动的时候不加载图片。
如果自定义的item中有图片,需要处理图片(减小图片所占内存),对图片进行边界压缩,用option类来保存图片大小,避免图片的实时缩放,先预先缩放到视图大小。
尽量避免在ListView适配器中使用线程,因为线程是产生内存泄漏的主要原因在于线程的生命周期不可控制。
Android数据存储方式
SharedPreferences方式:它是Android提供的用来存储一些简单配置信息的一种机制,采用XML格式将数据存储到设备中,只能在同一个包内使用,不能在不同的包之间使用。文件存储方式: /data/data/包名。
SQLite数据库方式:SQLite是Android所带的一个标准数据库,它支持SQL语句,是一个轻量级的嵌入式数据库。
内容提供者(Content provider)主要用于程序之间进行数据交换,从而能够让其他的应用保存或读取此Content provider的各种数据类型。
网络存储方式:通过网路上提供给我们的存储空间来上传(存储)和下载(获得)我们存储在网络空间的数据信息。
Handler机制原理(消息模型)
Android提供Handler和Looper啦满足线程间通信,Handler先进先出原则,Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)1. Looper: 一个线程只可以有一个Looper对象,由它来管理此线程里MessageQueue。
2. Handler:可以构造一个Handler对象来与Looper沟通,一遍刷新信息到MessageQueue里,或者接受Looper从MessageQueue取出,送来的消息。
3. MessageQueue: 用来存放线程放入的消息。
4. 线程:UIthread通常就是MainThread(主线程是ActivityThread)Android启动程序的时候回替它建立一个MessageQueue和Looper对象。简单叙述一下,之后也许会出博客专门讲一下Android中的消息模型
GC是什么?为什么要有GC
GC是垃圾回收的意思。内存处理一直是程序员最容易出问题的地方,GC可以达到自动处理内存,回收垃圾的作用,是JAVA程序员不用但系内存管理的问题,标记法:在进行来及会收拾,垃圾回收器首先搜索内存中托管对象,然后从托管代码中搜索被引用的对象并标记有效,接着释放没有被标记为有效的对象并回收内存,最后整理内存将有效对象挪到一起。分代式垃圾收集:–伊甸园(Eden)这是对象最初诞生的区域,并且对大多数对象来说这里是他们唯一存在的区域。–幸存者乐园:从伊甸园幸存下来的对象会被挪到这个区域。–终身颐养园:这是足够老的幸存对象的归宿,年轻代收集过程不会触及这个地方,当年轻代收集不能把对象放进颐养园是,就会触发一次完全收集,可能还会牵扯到压缩,以便为大对象腾出足够空间。应用内存如何优化
bitmap设置图片的大小bitmap对象销毁,借助recycle方法让GC回收bitmap对象。
尽量避免static成员变量引用资源消耗过多。
使用Application的context
及时关闭资源,如cursor
对于经常使用的图片使用软引用保存。
线程也是造成内存泄漏的一个重要原因,在于线程的生命周期不可控制:将线程内部类改为静态内部类,用弱引用来保存context引用
使用.9图片。
Android系统架构,按顺序
应用程序层,java语言,应用程序开发应用程序框架层,java语言 OS定制,FrameWork层开发
系统运行库层,C,C++实现,so库
Linux内核层
怎样实现自定义View
继承自View类,添加构造方法重写需要的方法
建立attrs.xml文件,获得自定义属性。
减少GC开销的措施
不要显示调用System.gc();尽量减少临时对象的使用。
对象不用时最好显式置为Null
尽量使用StringBuffer,而不是用String来累加字符串。
能用基本类型的就不用包装类型。
尽量少用今天对象变量。
分散对象创建或删除的时间。
相关文章推荐
- 一个关于if else容易迷惑的问题
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件