GridView加适配器的方式html
若是仅仅只用gridview加适配器的方法,由于加载图片是须要时间的,若是你直接在getview中加载图片的话,就会影响UI,照成滑动的时候卡顿。因此,每加载一个图片的时候,咱们会开启一个额外的进程,这样就不会影响UI主线程了。android
仅仅只是开启一个额外的线程会出现“乱序”的问题。也就是“并发性”的问题。并发
由于,当你进行滑动的时候,凡是通过的区域都会打开线程加载图片,每一个线程执行完毕的时间不是固定的。只有当线程执行完毕后,才会显示在当前屏幕上。所以,当你大规模的滑动的时候,有些区域的图片还没显示就被滑走,可是他们的线程还在,全部的线程都挤到当前屏幕显示。因此被滑过的图片会在相续的显示,每每一个位置要显示好几张不一样的图片(由于线程加载的时差相互覆盖),最后显示为该屏幕原本的图片。ide
这就是“并发性”的问题,并发性是指两个或多个事件在同一时间间隔内发生。spa
这样应该就能明白为何会出现并发性问题,由于同时有多个线程再执行,咱们不能保证图片的线程在被滑过以后就中止执行了。.net
解决并发性问题,我最近尝试的方式有两种,一种Android doc上推荐的方法,还有一个就是看guolin大神的博客上的方法。线程
Android doc上推荐的方式htm
Android doc上推荐的方法,思路是将线程与每一个位置(ImageView)绑定,在图片没有加载完以前先用一个站位图片站着,若正在执行的线程不是当前图片所绑定的线程就取消掉,再也不加载。这样就只有被绑定的线程才能执行,不会在一个位置上重复出现多张不一样的图片。blog
参考连接:进程
http://developer.android.com/training/displaying-bitmaps/process-bitmap.html
guolin大神的setTag方式
而guolin大神用了一个ImageView.setTag(imgeUri),为每一个位置绑定一张图片,其中p_w_picpathUri是每张图片在本地的存储路径,既能保证不重复,也能够用它来加载图片。
参考连接:http://blog.csdn.net/guolin_blog/article/details/9526203
因此我本身试着用了setTag()写了一下,确实能解决问题。可是,图片出现的速度比guolin大神的慢了许多,比Android doc也慢了许多。想了一下,原来是由于Android doc的方法是在判断后有取消线程的执行。而我只是在线程执行以后,判断该线程所加载的图片是否与该位置绑定。没绑定就不显示。这样全部线程无论有用没有都执行了一遍,效率很低。而guolin大神的又不同,由于他重写了OnScoll(),在滑动时,全部线程都取消,只有停下来的时候才开线程,因此,也不会有无用的线程在执行。我以为这样也很不错!