1.surfaceView问题
1.surfaceView 双缓冲机制,导致背景闪烁 (清空canvas背景,将绘制的数据变量设置成全局变量)
- surfaceView 卡顿问题。为了降低cpu消耗,在onAttachWindow中打开线程绘制,在DeatchWindow中取消线程绘制。于是导致了卡顿问题。
官网文档说:surfaceView 必须在surfaceCreated和surfaceDestroy之间,运行线程 否则就会导致卡顿
2.cpu占用率过高
- cpu过度绘制
- 通过profiler查看一些,异常的线程运行情况,加入睡眠
- 像摄像头等,降低采样率
- 一些设置成gone的view,依旧会重新绘制,所以可以考虑设置成null,需要的时候在加载进来
- v使用merge .ViewStub 优化布局
- so占用线程资源 优化
3. 内存优化
- 内存泄露
- bitmap占用的资源,更改Bitmap编码
- 能使用layer就是用layer
- 用ArrayMap/SparseArray代替HashMap (SparseArray key为int类型,避免了自动装箱/拆箱,ArrayMap,千级一下用这俩个 性能会更加好)
4.多线程问题
1. 四种线程池:
cachedThreadPool, singleThreadPool, cachedThreadPool,fixedThreadPool,scheduledThreadPool
2.线程中断的方式
- 在run方法中加入interrupt()判断,当外部调用了interrupt(),线程的isinterrupt ()变成true了,此时可以达到中断的目的。
2.run方法中 睡眠。通过异常终止线程的运行
3.多线程三种锁:
-
方法锁:多线程操作同一个对象的 相同方法,
-
对象锁:给同步的代码块 加上锁
-
类锁:修饰静态变量/静态方法,适用于多线程下,同一个class 有多个实例的情况
-
wait 对象调用wait方法之前,要先加锁,然后调用wait,让线程挂起
-
notify, 唤醒一个处于等待状态的thread
-
thread.yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会
-
thread.join 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
-
thread.start 调用run方法 和thread.run 直接调用的区别:
调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。
5. anr问题
1.广播/service中有耗时任务导致anr,这类比较好解决
2.android系统 cpu占用过高,打开一些activity,Logcat 中提示input anr,打印出 各进程占用的anr数据
3.查看data/anr data/tombstones 查看anr和 so异常日志
6.tv端事件分发+焦点跳转
7.eventbus源码解析
8. Glide 如何维护Bitmap池的?
Glide.with()-----初始化RequestManager------得到SingleRequest----SingleRequest.into 实际上调用的是Engine的into方法-----Engine.into方法会进一步调用loadFromActiveResources/loadFromCache。假如内存中没有EngineJob 就开始工作
9.接触到的容器
HashMap,ArrayMap,SparseArray,CurrentHashMap,HashTable
10.ota升级的bug
ota升完级,直接崩溃,so提示找不到某个so。不进行ota升级或者恢复出厂设置,就能进行安装运行。出现的问题是ota升级之后,/data/dalvik-cache/arm 中之前的dex 没有被清除,dex不一致,
11 .四种元注解
@Retention (Source,Class,Runtime) @Target (Class Method)
网友评论