0

好的,

我有一个奇怪的问题。

当用户滚动时,我将照片加载到列表视图中(这意味着如果从磁盘或在线获取,这需要一些时间并且它们会“弹出”)

1)

我确保我只在线获取一个图像 + 一次将大小调整为 1/3 宽度(锁定)——这是为了确保没有例如 5 个线程同时将 .jpg 转换为位图。(想象一下用户滚动得非常快,那么可以想象这可能会发生。)

2)

磁盘上的所有图像只有 1/3 宽度

3)

当位图被放大以适应设备宽度时,我调用recycle并将位图设置为 null 在getView中使用时。(我将位图转换为Listitem imageview在setImageDrawable调用中使用的BitmapDrawable对象)

4)

如果不为空,我会在getView中重用视图

5)

我像这样加载位图:

BitmapFactory.Options o = new BitmapFactory.Options();   
o.inPurgeable = false; // I do not use this since I resize/scale down images myself later
o.inInputShareable = false;
o.inPreferredConfig = Config.RGB_565;
res.bitmap = BitmapFactory.decodeStream(is, null, o);

6)

我也清理废品

public void onMovedToScrapHeap(View view) {
          final TextView description = (TextView)view.findViewById(R.id.listitem_news_content);
          description.setText("");
          final ImageView image = (ImageView)view.findViewById(R.id.listitem_news_image);
          image.setImageBitmap(null);                                            
        }

我正在三星 Galaxy II 上进行测试。你们对我还可以尝试什么有什么想法吗?由于我最多只需要显示 10 个项目,我认为应该是可能的......

4

2 回答 2

2

尝试使用广泛使用的库 Universal Image Loader https://github.com/nostra13/Android-Universal-Image-Loader

它简单直接,您永远不必关心自己解码图像。

选项二:Square 团队提供了一个强大的新 API 来加载图像http://square.github.io/picasso/

于 2013-09-15T22:18:45.913 回答
1

试试这个,它在 OutOfMemory 的情况下对我有用...使用 System.gc()

bitmap = null;
imageView.setImageBitmap(null);
System.gc();
于 2013-09-16T12:15:14.147 回答