ListView 优化
0层优化:不优化
1层优化:最多加载 n+1 个 convertView
复用 convertView 每次不用去加载一个新的 view 复用 convertView 来解决每次都加载一个新的 view
这样就不用每次都加载一个新的view到内存中,减少了对内存的使用
2层优化:优化 convertView 里面的子 view
优化其他的显示视图,如 TextView
一层优化只优化了 convertView 没有优化 convertView 里面的子 view,即使一层优化,优化了convertView
但是里面的子 view 还是每次都去加载,这样对内存也是相当好资源的
所有二层优化就是优化 convertView 里面的子 view
也是使用 setTag 的方式来进行优化
3层优化:
对图片的优化,即加载图片,使用图片的三级缓存
图片的三级缓存
1).一级缓存(内存缓存),图片在内存中,直接加载,如果内存缓存中没有,则向二级缓存中加载图片
2).二级缓存(本地缓存),图片保存在本地SD卡中,如果一级缓存中没有才在二级缓存中加载图片,如二级缓存中也没有
则向三级缓存中加载,如果有,加载的同时把图片保存到一级缓存中
3).三级缓存(服务器缓存),图片保存在服务器端,如果在一级缓存和二级缓存中都没有找到图片,就到服务器端的三级缓存中
加载,加载过来显示出来的同时,保存到一级缓存和二级缓存中
使用图片的三级缓存存在的问题(图片的闪屏)
当快速滑动的时候,会出现图片的缓存,因为 convertView 的复用,和线程的多次启动,但是还没来得及显示图片就被复用,
但是又是一个新的线程,同一个视图,多个线程,多张图片,所以就会出现闪屏的问题
解决办法:
使用 view 的setTag方法,把要显示的图片,保存到里面
在启动分线程联网请求和显示图片的时候通过getTag取出来
再启动分线程联网请求图片是,要请求的图片是不是要显示的,如果不是,则结束
在显示图片之前判断是不是要显示的那张图片,有可能已经被更改了,如果不是结束,
4层优化:
当数据量非常大的时候,就需要使用四次优化,分页或者其他技术
数据全部是从服务器端获取,不可能一次获取全部的数据,都是每次只获取部分数据显示
而不是全部加载到客户端进行显示,可能使用到的技术:分页,下拉刷新等
0层优化:不优化
1层优化:最多加载 n+1 个 convertView
复用 convertView 每次不用去加载一个新的 view 复用 convertView 来解决每次都加载一个新的 view
这样就不用每次都加载一个新的view到内存中,减少了对内存的使用
2层优化:优化 convertView 里面的子 view
优化其他的显示视图,如 TextView
一层优化只优化了 convertView 没有优化 convertView 里面的子 view,即使一层优化,优化了convertView
但是里面的子 view 还是每次都去加载,这样对内存也是相当好资源的
所有二层优化就是优化 convertView 里面的子 view
也是使用 setTag 的方式来进行优化
3层优化:
对图片的优化,即加载图片,使用图片的三级缓存
图片的三级缓存
1).一级缓存(内存缓存),图片在内存中,直接加载,如果内存缓存中没有,则向二级缓存中加载图片
2).二级缓存(本地缓存),图片保存在本地SD卡中,如果一级缓存中没有才在二级缓存中加载图片,如二级缓存中也没有
则向三级缓存中加载,如果有,加载的同时把图片保存到一级缓存中
3).三级缓存(服务器缓存),图片保存在服务器端,如果在一级缓存和二级缓存中都没有找到图片,就到服务器端的三级缓存中
加载,加载过来显示出来的同时,保存到一级缓存和二级缓存中
使用图片的三级缓存存在的问题(图片的闪屏)
当快速滑动的时候,会出现图片的缓存,因为 convertView 的复用,和线程的多次启动,但是还没来得及显示图片就被复用,
但是又是一个新的线程,同一个视图,多个线程,多张图片,所以就会出现闪屏的问题
解决办法:
使用 view 的setTag方法,把要显示的图片,保存到里面
在启动分线程联网请求和显示图片的时候通过getTag取出来
再启动分线程联网请求图片是,要请求的图片是不是要显示的,如果不是,则结束
在显示图片之前判断是不是要显示的那张图片,有可能已经被更改了,如果不是结束,
4层优化:
当数据量非常大的时候,就需要使用四次优化,分页或者其他技术
数据全部是从服务器端获取,不可能一次获取全部的数据,都是每次只获取部分数据显示
而不是全部加载到客户端进行显示,可能使用到的技术:分页,下拉刷新等