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),为每个位置绑定一张图片,其中imageUri是每张图片在本地的存储路径,既能保证不重复,也可以用它来加载图片。

参考链接:http://blog.csdn.net/guolin_blog/article/details/9526203

所以我自己试着用了setTag()写了一下,确实能解决问题。但是,图片出现的速度比guolin大神的慢了许多,比Android doc也慢了许多。想了一下,原来是因为Android doc的方法是在判断后有取消线程的执行。而我只是在线程执行之后,判断该线程所加载的图片是否与该位置绑定。没绑定就不显示。这样所有线程不管有用没有都执行了一遍,效率很低。而guolin大神的又不一样,因为他重写了OnScoll(),在滑动时,所有线程都取消,只有停下来的时候才开线程,所以,也不会有无用的线程在执行。我觉得这样也很不错!

时间: 2024-12-10 11:19:32

android图片显示(一) ———— 关于并发,乱序问题的处理的相关文章

Android ListView异步加载图片乱序问题,原因分析及解决方案

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是用法比较复杂的了,关键是用法复杂也就算了,它还经常会出现一些稀奇古怪的问题,让人非常头疼.比如说在ListView中加载图片,如果是同步加载图片倒还好,但是一旦使用异步加载图片那么问题就来了,这个问题我相信很多Android开发者都曾经遇到过,就是异步加载图片会出现错位乱序的情况.遇到这个问题时,不

一步一步学会http获取tomcat服务端的图片,在android客户端显示

最简单的利用服务端来下载图片到客户端上面,刚开始接触,记录一下,同时希望帮助到新人. 在看本篇文章之前,你可以先看下这两篇文章 加载web项目时报的错误:Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modul http://blog.csdn.net/harryweasley/article/details/45723443 Eclipse无法启动tomcat http://blog.csdn.ne

Android ListView滑动过程中图片显示重复错乱闪烁问题解决

转自:http://www.oschina.net/question/221817_121051 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制.1.原因分析ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则p

Android图片处理:识别图像方向并显示

在Android中使用ImageView显示图片的时候发现图片显示不正,方向偏了或者倒过来了. 解决这个问题很自然想到的分两步走: 1.自动识别图像方向,计算旋转角度: 2.对图像进行旋转并显示. 一.识别图像方向 首先在这里提一个概念EXIF(Exchangeable Image File Format,可交换图像文件),具体解释参见Wiki. 简而言之,Exif是一个标准,用于电子照相机(也包括手机.扫描器等)上,用来规范图片.声音.视屏以及它们的一些辅助标记格式. Exif支持的格式如下:

Android ListView滑动过程中图片显示重复错位闪烁问题解决[转载]

转自:here 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制.1.原因分析ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存:b. 获取滑入屏幕的行item之前会先判断缓存中是否有可

android 图片解码显示流程

问题来源 android 可以在 gallery 里面显示内部存储的图片,支持 jpeg,png,gif,bmp 等,甚至文件类型和图片后缀名不一致,只要是图片文件就能显示,然后 git 只会显示第一帧图像,然而 android 其实是可以显示 gif 动画的,在浏览器里打开 gif 动画,就能够正常加载显示. Gallery 查看图片 gallery 实现了 Gallery/src/com/android/camera/ViewImage.java ImageViewTouchBase new

Android相机、相册获取图片显示(压缩)并保存到SD卡

做过类似需求的同学都知道,在Activity中通过如下代码可以启动相机,然后在重写的onActivityResult方法中可以获取到返回的照片数据: Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(openCameraIntent, TAKE_PICTURE); 在onActivityResult方法里通过Intent的getData方法获取的数据转换成bi

app开发历程——android手机显示服务器端图片思路

以前自己都不知道怎么去显示服务器端的图片,还好在apkbus论坛上找到一个特别简单的例子.虽然一天天忙忙碌碌,但是自己内心其实有一种想逃的心里,说不定哪天就会冒出来. 1.首先服务器端图片 这里的ImageServlet.java,没有做相关处理 这里启动tomcat,这时在浏览器中输入http://localhost:8080/ReadImage1/image/a.jpg 这时应该能看到这张图片. 2.android程序 布局文件: 1 <?xml version="1.0"

IT观察】网络通信、图片显示、数据库操作……Android程序员如何利用开源框架

每个Android 程序员都不是Android应用开发之路上孤军奋战的一个人,GitHub上浩如烟海的开源框架或类库就是前人为我们发明的轮子,有的轮子能提高软件性能,而有的轮子似乎是以牺牲性能为代价换取编程速度.擅长利用轮子的程序员已经遥遥领先,不擅长利用轮子的程序员总是嫌前人发明的轮子不够圆,自己造个方轮子上路后才发现落后了. 作者:玖哥来源:51CTO|2017-10-19 16:06 移动端 收藏 分享 [51CTO.com原创稿件]每个Android 程序员都不是Android应用开发之