Android面试题一

原创 2016年06月01日 09:15:42

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的优化方案

  1. 如果自定义适配器,那么在getView方法中要考虑方法传进来的参数,contentView是否为null,如果为努力了就创建contentView并返回,如果不为null则直接使用,在这个方法中尽可能少创建View。
  2. 给contentView设置tag,传入一个ViewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果。
  3. 如果ListView需要显示的item很多,就考虑分页加载,比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候,再去加载接下来的20条。
  4. 快速滑动的时候不加载图片。
  5. 如果自定义的item中有图片,需要处理图片(减小图片所占内存),对图片进行边界压缩,用option类来保存图片大小,避免图片的实时缩放,先预先缩放到视图大小。
  6. 尽量避免在ListView适配器中使用线程,因为线程是产生内存泄漏的主要原因在于线程的生命周期不可控制。

Android数据存储方式

  1. SharedPreferences方式:它是Android提供的用来存储一些简单配置信息的一种机制,采用XML格式将数据存储到设备中,只能在同一个包内使用,不能在不同的包之间使用。
  2. 文件存储方式: /data/data/包名。
  3. SQLite数据库方式:SQLite是Android所带的一个标准数据库,它支持SQL语句,是一个轻量级的嵌入式数据库。
  4. 内容提供者(Content provider)主要用于程序之间进行数据交换,从而能够让其他的应用保存或读取此Content provider的各种数据类型。
  5. 网络存储方式:通过网路上提供给我们的存储空间来上传(存储)和下载(获得)我们存储在网络空间的数据信息。

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)这是对象最初诞生的区域,并且对大多数对象来说这里是他们唯一存在的区域。–幸存者乐园:从伊甸园幸存下来的对象会被挪到这个区域。–终身颐养园:这是足够老的幸存对象的归宿,年轻代收集过程不会触及这个地方,当年轻代收集不能把对象放进颐养园是,就会触发一次完全收集,可能还会牵扯到压缩,以便为大对象腾出足够空间。

应用内存如何优化

  1. bitmap设置图片的大小
  2. bitmap对象销毁,借助recycle方法让GC回收bitmap对象。
  3. 尽量避免static成员变量引用资源消耗过多。
  4. 使用Application的context
  5. 及时关闭资源,如cursor
  6. 对于经常使用的图片使用软引用保存。
  7. 线程也是造成内存泄漏的一个重要原因,在于线程的生命周期不可控制:将线程内部类改为静态内部类,用弱引用来保存context引用
  8. 使用.9图片。

Android系统架构,按顺序

  1. 应用程序层,java语言,应用程序开发
  2. 应用程序框架层,java语言 OS定制,FrameWork层开发
  3. 系统运行库层,C,C++实现,so库
  4. Linux内核层

怎样实现自定义View

  1. 继承自View类,添加构造方法
  2. 重写需要的方法
  3. 建立attrs.xml文件,获得自定义属性。

减少GC开销的措施

  1. 不要显示调用System.gc();
  2. 尽量减少临时对象的使用。
  3. 对象不用时最好显式置为Null
  4. 尽量使用StringBuffer,而不是用String来累加字符串。
  5. 能用基本类型的就不用包装类型。
  6. 尽量少用今天对象变量。
  7. 分散对象创建或删除的时间。
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)