美文网首页移动互联网技术分享程序员Android知识
listview的ViewHolder为什么要用static?

listview的ViewHolder为什么要用static?

作者: 黑泥卡 | 来源:发表于2016-04-01 23:13 被阅读1263次

答案整理:
本人非常赞同1

1

出处
https://teamtreehouse.com/community/why-was-the-viewholder-class-declared-as-a-static-class

一般来说,我们声明为静态嵌套类,当它没有依赖外部类。在我们的例子中,ViewHolder类从未引用(访问)适配器类的任何成员变量(外部类),因此我们可以声明为静态的。保持简单nested-static类只是另一个(外)类是嵌套的可读性,因为它的使用仅限于只有它的外部类。你必须宣布非静态嵌套类(称为内部类)如果访问外部类的成员变量。

2

《Effective Java》第22条 优先考虑静态成员类
其中有条建议:
如果声明成员类不要求访问外围实例,就要始终把static修饰符放在它的声明中,使它成为静态成员类,而不是非静态成员类。
因为非静态成员类的实例会包含一个额外的指向外围对象的引用,保存这份引用要消耗时间和空间,并且导致外围类实例符合垃圾回收时仍然被保留。如果没有外围实例的情况下,也需要分配实例,就不能使用非静态成员类,因为非静态成员类的实例必须要有一个外围实例。

PS:强烈推荐《Effective Java》这本书,会让你有意想不到的收获。

文/CPPAlien(简书作者)
原文链接:http://www.jianshu.com/p/aa965968cbf5

3

这篇文章中没有提到加载时机的问题吧。在我的理解中:静态内部类主要作用就是,内部类是否需要隔离“外部类的this对象(指针)”。内部类是有 this 指针的,可以“直接”访问外部类的 成员变量和成员函数(包括私有的成员)。而静态内部类,没有这个this指针,所以无法“直接”调用。

Android代码中,经常使用的Builder,LayoutParams都是以静态内部类的方式存在啊。我们可以根据实际使用情况来效仿。


对于这篇文章,我理解。ViewHolder的构造和复用,与静不静态没关。核心是ListView(AdapterView),通过getView(int position, View convertView, ViewGroup parent) 的convertView会为开发者传入一个可以复用的对象。开发者需要利用该对象,减少应用内存的消耗。
如果从减少内存消耗的角度来开。我认为ViewHolder还是应该修饰成static比较好。这样ViewHolder中可以减少MainActivity的this指针,由于减少了一个this指针的引用,也会对MainActivity的引用计数大大减少。MainActivity的this指针继承于android的Context上下文,对于Context的回收遗漏,是Android内存管理中很大的问题。我们减少了对Context的引用,可以更容易减少Context引用计数出现问题。

4

http://stackoverflow.com/questions/13516835/why-in-viewholder-pattern-should-the-viewholder-class-be-static
My opinion is that it is better to have the ViewHolder class static as it won't leak the Adapter.
If the adapter retains some heavy Collections or even Views (depends on each particular case), it would be great to keep control of which objects retain the Adapter.
Having a lot of objects instances of an inner class will have those objects referencing the Adapter, thus retaining it. You should be careful about how the tags are managed (if the views are cleaned/removed automatically there is no problem>).

相关文章

网友评论

  • jamesvoid:总结一下就是:
    这是一种约定俗成的编程规范,而这个编程规范产生的原因就是:避免无必要的引用指向,进而避免可能产生的内存泄漏。
    毕竟从listview的角度来讲,从一般的业务逻辑与语法上来讲,不使用静态其实也没有问题。
    you use it,you will never get problem.you don't ,you might get problems
  • 君莫看:主要还是要看这个内部类,有没有引用外部类的数据方法,没有就用静态内部类

本文标题:listview的ViewHolder为什么要用static?

本文链接:https://www.haomeiwen.com/subject/qemylttx.html