最近辞职了,在找工作这里整理记录下面试遇到的题目:
2018/5/7
1.Android中跨进程通讯的方式有哪些?
Android中跨进程通讯的方式有网路、文件、广播、Aidl等;
2.为什么在子线程中创建handler会抛出异常,正常怎么创建子线程Handler?
在子线程中直接创建一个handler的时候会抛出
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
错误,这是因为没有调用线程Looper.perpare()方法去初始化Looper,所以Looper.myLooper对象是空的,需要调用perpare方法初始化Looper对象;
正常创建可以在主线程创建:
HandlerThread handlerThread = new HandlerThread("handlerThread-name");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());
子线程中创建Handler:
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Handler handler1 =new Handler(Looper.myLooper());
Looper.loop();
}
}).start();
3.Android中的内存泄漏和优化?
(1)单例导致内存泄露
单例的生命周期和应用一样长,如果一个对象(activity、service等上下文)已经没有用处了,但是单例还持有它的引用,那么在整个应用程序的生命周期它都不能正常被回收,从而导致内存泄露。
(2)静态变量导致内存泄露
静态变量存储在方法区,它的生命周期从类加载开始,到整个进程结束。一旦静态变量初始化后,它所持有的引用只有等到进程结束才会释放。
(3)非静态内部类导致内存泄露
非静态内部类(包括匿名内部类)默认就会持有外部类的引用,当非静态内部类对象的生命周期比外部类对象的生命周期长时,就会导致内存泄露。
(4)未取消注册或回调导致内存泄露
比如我们在Activity中注册广播,如果在Activity销毁后不取消注册,那么这个广播会一直存在系统中,同上面所说的非静态内部类一样持有Activity引用,导致内存泄露。因此注册广播后在Activity销毁后一定要取消注册。
(5)Timer和TimerTask导致内存泄露
(6)集合中对象未清理造成内存泄漏
这个比较好理解,如果一个对象放入到ArrayList、HashMap等集合中,这个集合就会持有该对象的引用。当我们不再需要这个对象时,也并没有将它从集合中移除,这样只要集合还在使用(而此对象已经无用了),这个对象就造成了内存泄露。并且如果集合被静态引用的话,集合里面那些没有用的对象更会造成内存泄露了。所以在使用集合时要及时将不用的对象从集合remove,或者clear集合,以避免内存泄漏。
(7)资源未关闭或释放导致内存泄露
在使用IO、File流或者Sqlite、Cursor等资源时要及时关闭。这些资源在进行读写操作时通常都使用了缓冲,如果及时不关闭,这些缓冲对象就会一直被占用而得不到释放,以致发生内存泄露。因此我们在不需要使用它们的时候就及时关闭,以便缓冲能及时得到释放,从而避免内存泄露。
(8)属性动画造成内存泄露
动画同样是一个耗时任务,比如在Activity中启动了属性动画(ObjectAnimator),但是在销毁的时候,没有调用cancle方法,虽然我们看不到动画了,但是这个动画依然会不断地播放下去,动画引用所在的控件,所在的控件引用Activity,这就造成Activity无法正常释放。因此同样要在Activity销毁的时候cancel掉属性动画,避免发生内存泄漏。
@Override
protected void onDestroy(){
super.onDestroy();
mAnimator.cancel();
}
(9)WebView造成内存泄露
关于WebView的内存泄露,因为WebView在加载网页后会长期占用内存而不能被释放,因此我们在Activity销毁后要调用它的destory()方法来销毁它以释放内存。
具体可以查看这里:Android内存优化——常见内存泄露及优化方案
4.adapter实现的两种方法?
这个问题看到的时候有点懵,因为平时间使用adapter的时候都是继承自BaseAdapter实现Adapter,可能他们想问的是这个问题
设计模式(五)适配器模式Adapter(结构型)因为不知道所以面试一般般了,继续努力!