首先说明这一片只针对我自己的情况,可能对普遍类的卡顿没有太大帮助。
其实在完成夜间模式前就发现主界面的listview卡顿的难以忍受,上网搜索资料有很多方法优化,我主要是将getview里的代码优化。
getview里最好不要有耗时操作,而我的getview方法中就存在着一个异步加载图片的过程,首先我的异步加载图片的方法可以将加载后的图片设置到imageview中,所以一开始的时候我就写在getview方法里了,所以首先先将加载图片的过程拿出来,配置adapter时直接将下载的图片通过hashmap传入,这里要注意hashmap是线程不安全的类型,异步加载图片必将会使多个线程同时对该hashmap进行增减,所以要通过collections将其改为线程安全类,如下:
private Map<String, Bitmap> bitmaps = Collections.synchronizedMap(new HashMap<String, Bitmap>())
上述问题改完后遇到另一个问题,就是我的listview通过addhead加入了一个viewpager,多次测试发现加入viewpager的数据图片在listview中首次加载不出来,这个结果也是测试了好久才发现规律,主要是因为listview与viewpager两个加载图片是分开的,但是图片最后保存以及命名都是统一的,造成了viewpager加载完成后listview相应的没有能加载出来,并且两部分分开加载也造成了资源浪费。于是便修改viewpager的adapter,让viewpager的图片直接从listview加载的图片中取出来相应的项目,这样测试总算通过了。
总结:getview中不要进行耗时操作
网络操作要尽可能的集中,减少资源消耗
数据更新完毕后及时调用adapter.notifyDataSetChanged();来进行更新数据,这样才能达到图片异步加载中的加载的步骤