自定义控件是android开发中最常见的技术,对于面试来说经常会被问到,然而面试者们的回答也几乎是千变一律,自定义View的原理,原理,原理.
当然不可否认自定义View原理是Android开发者必须了解的基础.但是时间开发中更需要了解的是对该View的性能优化.
OOM内存优化问题.
- 可以在onDraw中创建对象吗?
不建议你在draw或者layout的过程中去实例化对象!
- 我们应该在哪里创建对象?
在自定义控件的构造方法内创建.- new是需要分配内存空间的,如果在一个频繁重复的过程中去大量地new对象内存爆不爆我不知道,但是浪费内存那是肯定的
- 在onDraw中调用getCompoundDrawables会怎样?
此方法要不创建新的Drawable数组,要不就clone() mDrawables数组。无论是克隆还是新建都将创建新的数组,这里虽然Java使用浅拷贝来拷贝数组,但是数组本身会重新创建(只是数组成员引用被拷贝的数组成员)
要在onDraw中调用getCompoundDrawables,毕竟在运行过程中修改drawable的需求不多,如果真的要处理的话可以在,构造方法中init.
线程安全问题.
- 小Demo:实现一个圆让它的半径从小到大地不断变化,那怎么实现好呢 ?
提醒了解到一个知识点就是圆圈会在 onDraw()方法中不断的重新绘制.
google已经帮我封装了 postInvalidate()方法,使用到了
Thread()和postInvalidate()方法
.
invalidate()与postInvalidate()有什么区别?
android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate.
invalidate()在UI线程自身中使用;
postInvalidate()而在哪里都可以调用.那么使用invalidate()是否也可以实现刚刚那个效果?
因为刚刚说了,invalidate()在UI线程自身中使用,那么UI线程我们是不是可以加多个 handler对象来解决这个问题.
好,那我们是不是可以猜想下,其实postInvalidate()源码里应该也就是封装了一个handler().
演讲建议:
- 对于自定义来说要注意到的问题是优化,优化,优化,其次才是效果.
- 可以在讲这方面内容时加入一些基础知识,这样会更加通俗易懂
如onDraw中 不断的new 对象后果严重
- 讲的时候可以与实际项目关联,这样会更加生动.