Android面试题积累二

1.Handler机制的原理

Android提供了Handler和Looper来满足线程间的通信,Handler遵循先进先出的原则,Looper类用来管理特定线程内对象之间的信息交换(MessageExchange)

A.Looper:一个线程可以产生一个Looper对象,由他来管理此线程里的MessageQueue(消息队列)

B.Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里,或者接受Looper从MessageQueue里所取出的消息

C.MessageQueue:用来存放线程放入的消息

D.线程:UIthread通常就是main thread,而Android启动程序时会替它建立一个MessageQueue

2.Android中Activity,Intent,Content Provider,Service各有什么区别?

A.Activity,活动,一个活动就是一个用户可以操作的可视化用户界面,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。

B.Intent,意图,最重要的部分是动作和动作对应的数据。

C.Content Provider,内容提供器,Android应用程序能够将他们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中,当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。

D.Service,服务,具有较长的声明周期且没有用户界面的程序组件。

3.Android客户端如何实现自动登录?

通过SharedPreferences存储用户名和密码,当存储不为空时,实现自动登录功能。

4.ListView优化策略

A.对convertView进行判空,当convertView不为空的时候,直接重新使用convertView,从而减少了很多不必要的view的创建。

B.定义一个ViewHolder,将convertView的tag设置为ViewHolder,不为空时重新使用即可。

C.当ListView加载数据量较大时,可以采用分页加载和图片异步加载。

5.Android中GC(Garbage Collection)内存泄漏在什么情况下回出现?怎么解决?

内存泄漏是指:进程中某些对象已经没有使用价值了,但是他们却可以直接或间接地引用到gc roots,导致无法被GC回收。无用的对象占据着内存空间,是的实际可使用内存变小,形象的说就是内存泄漏了。

A.类的静态变量持有大数据对象:静态变量长期维持到大数据对象的引用,阻止垃圾回收。

B.非静态内部类的静态实例:非静态内部类会维持一个到外部类实例的引用,如果非静态内部类的实例是静态的,就会间接长期维持着外部类的引用,阻止被回收掉

C.资源对象为关闭:资源性对象如Cursor/File/Socker,应该在使用后及时关闭。未在finally中关闭,会导致异常情况下资源对象未被释放的隐患。

D.注册对象未反注册,导致观察者列表里维持着对象的引用,阻止垃圾回收

E.Handler临时性内存泄漏:Handler通过发送Message与主线程交互,Message发出之后是存储在MessageQueue中的,有些Message也不是马上就被处理的。在Message中存在一个target,是Handler的一个引用,如果Message在Queue中存在的时间过长,就会导致Handler无法被回收。如果Handler是非静态的,则会导致Activity或者Service不会被回收。由于AsyncTask内部也是handle机制,同样存在内存泄漏的风险。此种内存泄漏,一般是临时性的。

6.action节点中Android.intent.action.MAIN表名它所在的Activity是整个应用程序的入口点。

7.列举所知道的线程同步的方法

wait():让线程等待,将线程存储到一个线程池中;

notify();唤醒被等待的线程,通常都是唤醒线程池中的第一个。让被唤醒的线程处于临时阻塞状态;

notifyAll():唤醒所有的等待线程。将线程池中的所有线程都唤醒。

8.String与StringBuffer

String对象的长度一旦定义就固定不可以改变,对于已经存在的String对象的修改都是创建一个新的对象,然后把新的值存进去,String类不能被继承;StringBuffer是一个可变对象,当对它进行修改的时候,不会像String那样重新建立对象,它只能通过构造函数来建立对象,且StringBuffe认识一个线程安全的类。

9.ArrayList与LinkedList

ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构,ArrayList是随机访问的效率较高,LinkedList是新增和删除操作的效率较高。

10.HashMap与HashTable

HashMap是HashTable的轻量级实现,二者都实现了Map接口,但是HashMap允许空键值,由于HashMap是非线程安全的实现,因此,只有一个线程访问的情况下,效率要高于HashTable;

HashMap把HashTable的contains方法去掉了,改成了containsvalue和contianskey,这样不易引起误解;


HashTable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值