金山
1.Bitmap 大图加载?
考察点 :BitmapFactory.Options
使用BitmapFactory.Options获取图片大小,根据ImageView大小计算缩放比例。
1.BitmapFactory.Options 获取图片大小
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.qb, options);
根据ImageView大小计算缩放比例inSampleSize
选择占内存小的颜色模式,设置option.inPreferredConfig
2.leakCanary
内存溢出有几种情况
1.handle挟持Activity
2.bitmap图片没有释放回收
3.广播未取消注册
leakCanary 工作原理
重点:软引用
原理:
在一个Activity执行完onDestroy()之后,将它放入WeakReference中,然后将这个WeakReference类型的Activity对象与ReferenceQueque关联。这时再从ReferenceQueque中查看是否有没有该对象,如果没有,执行gc,再次查看,还是没有的话则判断发生内存泄露了
3.SDK设计模式
策略模式+工厂模式+反射
4.Router 路由器
组件化开发,少嵌入,可以多人开发。
5.密钥如何保存
1.keystore
2.生物认证保护
3.AES256加密保护
6.为什么选择ReactNative 不选择Flutter
7.ArrayList 如何一次遍历删掉指定字符串
倒序遍历remove掉指定字符,
因为用for顺序遍历remove的话会删除不了相同的字符如ArrayList里有两个bb字符,
用foreach则会报并发修改异常java.util.ConcurrentModificationException
因为在顺序遍历的时候,匹配到删除字符后,ArrayList源码里面会执行System.arraycopy方法,把
后一个元素移动至当前位置,导致下一次循环遍历时后一个字符串bb并没有遍历到,所以无法删除。
8.两个Thread 如何按顺序进行顺序执行
使用Thread.join Thread.await Thread.notify
1.join():是Theard的方法,作用是调用线程需等待该join()线程执行完成后,才能继续用下运行。
应用场景:当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。
2.
[1] 使用线程的join方法
[2] 使用主线程的join方法
[3] 使用线程的wait方法
[4] 使用线程的线程池方法
[5] 使用线程的Condition(条件变量)方法
[6] 使用线程的CountDownLatch(倒计数)方法
[7] 使用线程的CyclicBarrier(回环栅栏)方法
[8] 使用线程的Semaphore(信号量)方法
二面
1、gradle
2、Binder多进程通讯
3、性能优化
1.内存优化
2.代码优化
3.opencv优化二维码
4、一个app有多少个context
总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)
5、application 与activity 有什么区别
生命周期不同
6、一个activity有多少个window
phoneWindow