`
openxtiger
  • 浏览: 151691 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[Android] 图片缓存+Gridview显示的注意事项

 
阅读更多

在编写多图片上传时,遇到一个很郁闷的问题,就是在gridview中添加一个“+”项,经常会被后面添加的图片覆盖,变成两个图片一模一样。后面才发现,Gridview的Adapter会重复使用item项目来提高效率,这样当重新刷新时,每个item会被重新使用,但一次刷新时,一个position会一直使用一个item。

由于这个特性,当异步加载图片时,异步加载的图片还未完成,这样一个相同的item可能就会出现不是你想要的图片(原因就是你的item换成一个新的图片,而这个换的动作比上次用这个item去异步加载图片的快,因此即使这次换成功了,也会被异步加载成功的图片替换)。

简单说:就是一个item换两次图片时,哪个加载快就会被加载慢的图片覆盖。

 

那如何解决呢?

 

很简单,每个换图片时,将图片的路径设置在item的tag上,每次真正换图片时(调用setImageBitmap),判断此时的tag值和你换的最新图片的path是否一致,一致时才替换。

 

加上代码:

 

public class BitmapCache {

    public static void display(final ImageView iv,
                               final String thumbPath,
                               final String sourcePath,
                               final int reqWidth,
                               final int reqHeight) {
        if (TextUtils.isEmpty(thumbPath) && TextUtils.isEmpty(sourcePath)) {
            return;
        }

        final String path;
        if (!TextUtils.isEmpty(thumbPath)) {
            path = thumbPath;
        } else if (!TextUtils.isEmpty(sourcePath)) {
            path = sourcePath;
        } else {
            return;
        }

        if (iv.getTag() != null
                && iv.getTag().toString().equals(path)) {
            return;
        }
        iv.setTag(path);

        Bitmap bitmap = GlobalContext.getInstance().getBitmapCache().get(path + reqWidth + reqHeight);

        if (bitmap != null) {
            iv.setImageBitmap(bitmap);
            return;
        }

        iv.setImageBitmap(null);


        new MyAsyncTask<Void, Bitmap, Bitmap>() {

            //todo
            //when I finish new ImageView in the future, I will refactor these code....
            @Override
            protected Bitmap doInBackground(Void... params) {
                Bitmap bitmap = null;
                try {
                    bitmap = ImageUtility
                            .decodeBitmapFromSDCard(path, reqWidth, reqHeight);

                } catch (OutOfMemoryError ignored) {

                }

                return bitmap;
            }

            @Override
            protected void onPostExecute(Bitmap bitmap) {
                super.onPostExecute(bitmap);
                if (bitmap != null) {
// 判断 tag是否和最新的路径一致
                    if (path.equals(iv.getTag())) {
                        iv.setImageBitmap(bitmap);
                    }
                    GlobalContext.getInstance().getBitmapCache().put(path + reqWidth + reqHeight, bitmap);
                }
            }
        }.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);

    }
}

 重点在这:

if (iv.getTag() != null
                && iv.getTag().toString().equals(path)) {
            return;
        }
        iv.setTag(path);

 和这:

 

if (path.equals(iv.getTag())) {
                        iv.setImageBitmap(bitmap);
                    }

 

 

0
0
分享到:
评论

相关推荐

    android gridview 相关

    - 适当使用内存缓存:对于大图,可以使用LruCache或其他图片缓存库,减少内存消耗。 - 调整GridView的滚动性能:设置`smoothScrollbar=true`,使滚动更平滑;还可以通过`setFastScrollEnabled(true)`启用快速滚动...

    Android高级应用源码-gridview分页效果.rar

    6. **注意事项** - **处理空页面**:当数据为空或加载失败时,应有适当的提示。 - **错误重试机制**:加载失败后,提供重试功能,允许用户重新加载数据。 通过以上步骤,我们可以实现一个高效且用户体验良好的...

    Android应用源码之gridview分页效果.zip

    4. 注意事项: - 优化性能:避免在`getView()`方法中进行耗时操作,如图片加载,可以使用像Picasso或Glide这样的库来异步加载和缓存图片。 - 动态加载:初始加载少量数据,后续根据用户滚动情况动态加载,防止一次...

    android gridview分页

    在Android开发中,GridView是一种常用的布局控件,它允许我们以网格的形式展示数据,通常用于创建像图片墙、菜单或联系人列表等界面。当数据量较大时,为了提高用户体验和减少内存消耗,我们需要实现GridView的分页...

    Android.GridView实现宫式布局

    #### 五、注意事项 1. **性能优化**:使用`ViewHolder`模式来缓存视图,减少频繁创建视图带来的性能开销。 2. **资源回收**:确保在不再需要图片资源时及时释放,防止内存泄漏。 3. **自适应屏幕**:考虑不同屏幕...

    可以左右滚动的gridview

    通过上述步骤和注意事项,我们可以成功地创建一个可以左右滚动的gridview,用于展示照片或其他横向数据。在实际应用中,还可以根据需求添加更多的交互效果,如滑动监听、手势识别等,以增强用户体验。

    listview、gridview,viewpager加载网络图片

    3. 图片缓存:可能实现了内存和磁盘的双层缓存机制,以加快图片加载速度并减少网络请求。 4. 图片占位符:为了提升用户体验,可能会在图片加载前显示一个占位符,避免空白区域。 5. 加载失败处理:包含错误重试...

    ListView嵌套GridView使用详解及注意事项

    这种方式能够提供多维度的数据展现,比如在一个商品列表中,每个商品的图片、名称和价格可能都需要在一个单独的单元格中显示,此时就可以用到ListView嵌套GridView。 **ListView嵌套GridView的基本原理:** 在...

    Android 多图选择

    七、优化与注意事项 1. 考虑性能优化:对于大量图片,可以使用懒加载策略,只加载当前屏幕可见的图片。 2. 图片压缩:在上传图片前,可以对选中的图片进行压缩,减少网络传输的负担。 3. 用户体验:提供取消选择功能...

    JazzyListView ListView及GridView

    4. **注意事项** - 性能影响:虽然JazzyListView做了优化,但过多的动画可能会影响性能,尤其是对于内存有限的设备,应适度使用动画。 - 兼容性问题:部分动画可能在一些旧版本的Android系统上无法正常工作,因此...

    android 加载本地图片

    在Android开发过程中,为了防止因加载大量图片而导致应用程序出现内存溢出(OutOfMemoryError),通常会采用LRUCache(Least Recently Used Cache)来管理图片缓存。这种方式能够有效地减少内存消耗,提高应用性能。...

    Android读取assets目录下的所有图片并显示的方法

    5. 注意事项: - 记得在使用完InputStream后关闭它,以避免内存泄漏和资源浪费。 - 对于大量图片,考虑使用内存缓存和异步加载策略,如LruCache和AsyncTask,以提高性能和用户体验。 - 如果遇到图片无法显示的...

    AndroidStaggeredGrid允许非对齐行的GridView.zip

    7. `JavaApk源码说明.txt`: 可能包含了项目源码的简要说明,包括如何使用、注意事项以及可能存在的问题。 8. `下载更多打包源码~.url`: 一个链接,可能指向更多的Android开发资源或者相关项目的下载地址。 在实际...

    Android二级分类列表ListView GirdView

    7. 注意事项:在处理数据和更新视图时,确保UI线程不会阻塞,避免ANR(Application Not Responding)错误。可以使用AsyncTask或其他异步处理机制来加载数据。 总的来说,通过合理地结合ListView和GridView,开发者...

    gridGalleryDemo

    4. 注意事项: - 在适配器中,确保正确地设置了GridView和Gallery的数据源,以及正确地绑定数据到每个View。 - 考虑性能优化,避免一次性加载过多图片导致内存消耗过大。可以使用图片加载库,如Glide或Picasso,来...

    Android 炫酷相册源码.rar

    10. **readme.md** 文件: 这个文件通常包含项目介绍、安装指南、使用方法和注意事项,对于理解和使用源码至关重要。 通过分析上述知识点,开发者可以学习到如何在Android应用中实现一个高效、美观且用户友好的相册...

    android应用源码微信朋友圈相片浏览.rar

    在提供的压缩包中,“无标题.png”可能是展示图片浏览效果的示例,“源码说明.txt”可能包含了源码的使用说明和注意事项,“双击访问白杨工作室查看更多程序源码~.url”指向一个网址,可能提供了更多源码资源,...

    android开发之画廊,华丽的画廊

    以上是创建Android画廊应用的一些核心技术和注意事项。通过结合这些技术,我们可以构建出一个功能强大且视觉上引人入胜的画廊应用。在实际开发中,"MyGallery"可能是一个包含所有这些实现的项目,包含了必要的布局...

    Android Gallery 3D效果

    在提供的压缩包中,`教程重要说明.txt`可能是实现`Gallery 3D`效果的步骤和注意事项,而`GalleryFlow`可能是实现这一效果的一个示例项目。通过分析这个项目源代码,你可以学习到如何结合上述知识点来创建自定义的3D...

    PhotosWallDemo

    《Android照片墙应用实现Demo详解》 在移动应用开发领域,Android平台因其开源特性与丰富的功能,...同时,readme.txt文件可能提供了更多关于项目背景、使用方法和注意事项的信息,是进一步理解项目的重要参考资料。

Global site tag (gtag.js) - Google Analytics