资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

android图片显示(一)————关于并发,乱序问题的处理-创新互联

GridView加适配器的方式

“只有客户发展了,才有我们的生存与发展!”这是创新互联的服务宗旨!把网站当作互联网产品,产品思维更注重全局思维、需求分析和迭代思维,在网站建设中就是为了建设一个不仅审美在线,而且实用性极高的网站。创新互联对网站制作、成都网站建设、网站制作、网站开发、网页设计、网站优化、网络推广、探索永无止境。

如果仅仅只用gridview加适配器的方法,因为加载图片是需要时间的,如果你直接在getview中加载图片的话,就会影响UI,照成滑动的时候卡顿。所以,每加载一个图片的时候,我们会开启一个额外的进程,这样就不会影响UI主线程了。

仅仅只是开启一个额外的线程会出现“乱序”的问题。也就是“并发性”的问题。

因为,当你进行滑动的时候,凡是经过的区域都会打开线程加载图片,每个线程执行完毕的时间不是固定的。只有当线程执行完毕后,才会显示在当前屏幕上。因此,当你大规模的滑动的时候,有些区域的图片还没显示就被滑走,但是他们的线程还在,所有的线程都挤到当前屏幕显示。所以被滑过的图片会在相续的显示,往往一个位置要显示好几张不同的图片(因为线程加载的时差相互覆盖),最后显示为该屏幕本来的图片。

这就是“并发性”的问题,并发性是指两个或多个事件在同一时间间隔内发生。

这样应该就能明白为什么会出现并发性问题,因为同时有多个线程再执行,我们不能保证图片的线程在被滑过之后就停止执行了。

解决并发性问题,我最近尝试的方式有两种,一种Android doc上推荐的方法,还有一个就是看guolin大神的博客上的方法。

Android doc上推荐的方式

Android doc上推荐的方法,思路是将线程与每个位置(ImageView)绑定,在图片没有加载完之前先用一个站位图片站着,若正在执行的线程不是当前图片所绑定的线程就取消掉,不再加载。这样就只有被绑定的线程才能执行,不会在一个位置上重复出现多张不同的图片。

参考链接:

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(),在滑动时,所有线程都取消,只有停下来的时候才开线程,所以,也不会有无用的线程在执行。我觉得这样也很不错!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻名称:android图片显示(一)————关于并发,乱序问题的处理-创新互联
转载注明:http://cdkjz.cn/article/ieppp.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220