Android知识

自定义View你更需要注意的事情

2017-06-08  本文已影响163人  林锐波

自定义控件是android开发中最常见的技术,对于面试来说经常会被问到,然而面试者们的回答也几乎是千变一律,自定义View的原理,原理,原理.
当然不可否认自定义View原理是Android开发者必须了解的基础.但是时间开发中更需要了解的是对该View的性能优化.

OOM内存优化问题.

  1. 可以在onDraw中创建对象吗?
    不建议你在draw或者layout的过程中去实例化对象!
  • 我们应该在哪里创建对象?
    在自定义控件的构造方法内创建.
  • new是需要分配内存空间的,如果在一个频繁重复的过程中去大量地new对象内存爆不爆我不知道,但是浪费内存那是肯定的
  1. 在onDraw中调用getCompoundDrawables会怎样?

此方法要不创建新的Drawable数组,要不就clone() mDrawables数组。无论是克隆还是新建都将创建新的数组,这里虽然Java使用浅拷贝来拷贝数组,但是数组本身会重新创建(只是数组成员引用被拷贝的数组成员)

要在onDraw中调用getCompoundDrawables,毕竟在运行过程中修改drawable的需求不多,如果真的要处理的话可以在,构造方法中init.

线程安全问题.

  1. 小Demo:实现一个圆让它的半径从小到大地不断变化,那怎么实现好呢 ?
    提醒了解到一个知识点就是圆圈会在 onDraw()方法中不断的重新绘制.

google已经帮我封装了 postInvalidate()方法,使用到了Thread()和postInvalidate()方法.

  1. invalidate()与postInvalidate()有什么区别?
    android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate.
    invalidate()在UI线程自身中使用;
    postInvalidate()而在哪里都可以调用.

  2. 那么使用invalidate()是否也可以实现刚刚那个效果?
    因为刚刚说了,invalidate()在UI线程自身中使用,那么UI线程我们是不是可以加多个 handler对象来解决这个问题.

好,那我们是不是可以猜想下,其实postInvalidate()源码里应该也就是封装了一个handler().

演讲建议:

  1. 对于自定义来说要注意到的问题是优化,优化,优化,其次才是效果.
  2. 可以在讲这方面内容时加入一些基础知识,这样会更加通俗易懂如onDraw中 不断的new 对象后果严重
  3. 讲的时候可以与实际项目关联,这样会更加生动.
上一篇 下一篇

猜你喜欢

热点阅读