如果有人还不了解ViewHolder为什么可以起到优化作用,
我这边再做下简单说明:
Android的findViewById动作是比较耗时的,需要遍历布局的树形结构,才能找到相应的视图。所以如果想在这一块进行优化,我们就需要把find过后的内容进行缓存,所以就用ViewHolder的方法。
这个方法很容易理解,但是可能有些人还是比较较真,就像我,这样可以起到缓存作用,那为什么内部类非得要声明成static的呢,普通的内部类不是也起到这样的效果吗?这个疑问也困扰了我很久。直到我看了《Effective Java》这本书,才解开我这个困惑,原来这不是Android的优化,而是Java提倡的优化。
《Effective Java》第22条 优先考虑静态成员类
其中有条建议:
如果声明成员类不要求访问外围实例,就要始终把static修饰符放在它的声明中,使它成为静态成员类,而不是非静态成员类。
因为非静态成员类的实例会包含一个额外的指向外围对象的引用,保存这份引用要消耗时间和空间,并且导致外围类实例符合垃圾回收时仍然被保留。如果没有外围实例的情况下,也需要分配实例,就不能使用非静态成员类,因为非静态成员类的实例必须要有一个外围实例。