Android 关于getView方法中ViewHolder类static修饰符

来源:互联网 发布:乐知英语官网下载 编辑:程序博客网 时间:2024/06/06 18:45

关于这个问题面试也好笔试也罢,被好多公司当做一个题目来考,大家都知道viewholder是用来减少findview的次数,优化效力,这个确实可以减少。
http://bbs.csdn.net/topics/390200064
这个问题在论坛里这么说的,详细请戳上面链接
关于类似的论调也是层出不穷

    "保证ViewHolder的对象唯一,节省内存~如果处理不当,在异步加载图片时很可能导致图片位置错乱~"   “静态类,系统只会为其分配一个内存空间,即使再用new关键字获得引用,也不会从新分配内存空间,所有引用都指向这个内存空间的地址,所以肯定是一个对象”

还有以上这样的

然后 经过一番查证,有网友做了测试
http://www.wfuyu.com/technology/22200.html
此翻证明,不管用什么关键字修饰都会创建多个实例,而非一个(这个无可厚非)

然而我们静态内部类主要作用就是,内部类是否需要隔离“外部类的this对象(指针)”。内部类是有 this 指针的,可以“直接”访问外部类的 成员变量和成员函数(包括私有的成员)。而静态内部类,没有这个this指针,所以无法“直接”调用。

ViewHolder的构造和复用,与静不静态没关。核心是ListView(AdapterView),通过getView(int position, View convertView, ViewGroup parent) 的convertView会为开发者传入一个可以复用的对象。开发者需要利用该对象,减少应用内存的消耗。

而用static的真正目的其实是

从减少内存消耗的角度来看。ViewHolder还是应该修饰成static比较好。这样ViewHolder中可以减少Activity的this指针,由于减少了一个this指针的引用,也会对Activity的引用计数大大减少。Activity的this指针继承于android的Context上下文,对于Context的回收遗漏,是Android内存管理中很大的问题。我们减少了对Context的引用,可以更容易减少Context引用计数出现问题。

而这个解释来自于

《Effective Java》第22条 优先考虑静态成员类

其中有条建议:

如果声明成员类不要求访问外围实例,就要始终把static修饰符放在它的声明中,是它成为静态成员类,而不是非静态成员类。

因为非静态成员类的实例会包含一个额外的指向外围对象的引用,保存这份引用要消耗时间和空间,并且导致外围类实例符合垃圾回收时仍然被保留。如果没有外围实例的情况下,也需要分配实例,就不能使用非静态成员类,因为非静态成员类的实例必须要有一个外围实例。

1 0
原创粉丝点击