20161122
关于安卓adapter里面viewholder类到底用什么修饰,今天突然看到群里一个新手提了个问题就是关于这个问题,由于网上大神们早就把这方面研究的透透的了,各种优化各种例子,我们都是拿来用,也都很简单透彻好理解,所以有时候会忽略一些细节,看到这个问题后我首先也是想不出怎么回答,因为自己一直是用static修饰的至于为什么。。估计是从学这个就是用static修饰的吧,后来发现其实不用这个修饰也没什么影响,但也没去注意它一直这样写的,在网上查了下。
静态内部类主要作用就是,内部类是否需要隔离“外部类的this对象(指针)”。内部类是有 this 指针的,可以“直接”访问外部类的 成员变量和成员函数(包括私有的成员)。而静态内部类,没有这个this指针,所以无法“直接”调用。
个人的习惯,我通常会把内部静态类,作为一个单独的java文件。
但是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引用计数出现问题。