最近辞职了, 在找工作这里整理记录下面试遇到的题目:
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(结构型) https://blog.csdn.net/hguisu/article/details/7527842 因为不知道所以面试一般般了, 继续努力!
来源: http://www.jianshu.com/p/2e55ea3b55c2