Android 职业就业前景是非常有前途的。如果你对 Android 开发感兴趣,并且愿意不断学习和提高自己的技能,那么你将有很多机会在这个领域取得成功。本文会提供android面试题及其参考答案,希望对你有所帮助。
1、谈谈消息机制Handler作用 、要素和流程是怎样的 ?
负责跨线程通信,这是因为在主线程不能做耗时操作,而子线程不能更新UI,所以当子线程中进行耗时操作后需要更新UI时,通过Handler将有关UI的操作切换到主线程中执行。
具体分为四大要素
2、一个线程能否创建多个Handler,Handler跟Looper之间的对应关系 ?
一个Thread只能有一个Looper,一个MessageQueen,可以有多个Handler以一个线程为基准,他们的数量级关系是: Thread(1) : Looper(1) : MessageQueue(1) :Handler(N)
3、软引用跟弱引用的区别
软引用(SoftReference):如果一个对象只具有软引用,则内存空间充足时,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以一直被程序使用。
弱引用(WeakReference):如果一个对象只具有弱引用,那么在垃圾回收器线程扫描的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
两者之间根本区别在于:只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。而只具有软引用的对象只有当内存不够的时候才被回收,在内存足够的时候,通常不被回收。
4、为什么系统不建议在子线程访问UI?
Android的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态这时你可能会问为何系统不对UI控件的访问加上锁机制呢?因为加锁机制会让UI访问逻辑变的复杂加锁机制会降低UI的访问效率,因为加锁会阻塞某些线程的执行
5、Looper死循环为什么不会导致应用卡死?
主线程的主要方法就是消息循环,一旦退出消息循环,那么你的应用也就退出了,Looer.loop方法可能会引起主线程的阻塞,但只要它的消息循环没有被阻塞,能一直处理事件就不会产生ANR异常。
造成ANR的不是主线程阻塞,而是主线程的Looper消息处理过程发生了任务阻塞,无法响应手势操作,不能及时刷新UI。
阻塞与程序无响应没有必然关系,虽然主线程在没有消息可处理的时候是阻塞的,但是只要保证有消息的时候能够立刻处理,程序是不会无响应的。
6、使用Handler的postDealy后消息队列会有什么变化?
如果队列中只有这个消息,那么消息不会被发送,而是计算到时唤醒的时间,先将Looper阻塞,到时间就唤醒它。但如果此时要加入新消息,该消息队列的对头跟delay时间相比更长,则插入到头部,按照触发时间进行排序,队头的时间最小、队尾的时间最大
8、Message可以如何创建?哪种效果更好,为什么?
可以通过三种方法创建:
(1)直接生成实例Message m = new Message
(2)通过Message m = Message.obtain
(3)通过Message m = mHandler.obtainMessage()
后两者效果更好,因为Android默认的消息池中消息数量是10,而后两者是直接在消息池中取出一个Message实例,这样做就可以避免多生成Message实例。