项目难点

1.surfaceView问题

1.surfaceView 双缓冲机制,导致背景闪烁 (清空canvas背景,将绘制的数据变量设置成全局变量)

  1. surfaceView 卡顿问题。为了降低cpu消耗,在onAttachWindow中打开线程绘制,在DeatchWindow中取消线程绘制。于是导致了卡顿问题。

官网文档说:surfaceView 必须在surfaceCreated和surfaceDestroy之间,运行线程 否则就会导致卡顿

2.cpu占用率过高

  1. cpu过度绘制
  2. 通过profiler查看一些,异常的线程运行情况,加入睡眠
  3. 像摄像头等,降低采样率
  4. 一些设置成gone的view,依旧会重新绘制,所以可以考虑设置成null,需要的时候在加载进来
  5. v使用merge .ViewStub 优化布局
  6. so占用线程资源 优化

3. 内存优化

  1. 内存泄露
  2. bitmap占用的资源,更改Bitmap编码
  3. 能使用layer就是用layer
  4. 用ArrayMap/SparseArray代替HashMap (SparseArray key为int类型,避免了自动装箱/拆箱,ArrayMap,千级一下用这俩个 性能会更加好)

4.多线程问题

1. 四种线程池:
cachedThreadPool, singleThreadPool, cachedThreadPool,fixedThreadPool,scheduledThreadPool

2.线程中断的方式

  1. 在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)

12. 插件化方案的了解

你可能感兴趣的:(项目难点)