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接口的一个实现。