这是个问题啊,会提示VM不会分配这么大的内存。网上有一些解决方案,但是感觉不是很合理。我也越到了图片内存的问题。不过,我是自定义VIew。

解决方案 »

  1. http://blog.csdn.net/jefferyyangkai/article/details/7016829
      

  2. 图片很吃内存的
    List模式时尽量用低分辨率的图片
    detail(单张)模式时先用低分辨加载,再慢慢加载高清的
      

  3. 我的问题昨天下午解决了,你使用控件来显示,我不太清楚怎么回收。我的是几个游戏界面相互切换,而且图片也非常多,最后就是重新定义一个回收函数,在加载另外一个View的时候,循环释放之前View的Bitmap,效果不错,没有遇到这个OOM了。
      

  4. 你是自定义一个AdapterView吗?
      

  5. 现在问题是LinearLayout不会重用界面,ImageView不能重用,所以对应的图片也没法释放
      

  6. 如果数据比较多,果断用listview啊,adapter只会加载当前在界面上显示的数据,当你要显示非常多数据的时候,你会发现用listview的性能比scrollview要强多了
      

  7. 问题是现在要做瀑布流啊,listview满足不了这样的需求
      

  8. 其实还是得有ListView的方式才能满足无限量图片你可以用多个ListView的方式并排实现,每个ListView自定义getView,可以使listView的每条记录高度不受固定限制,例如通过获取图片的尺寸高度来设置listview的高度。
      

  9. 那拖动的时候,两边listview怎么同步呢
      


  10. 每个ListView都setOnScrollListener、setOnTouchListener,同步滚动。
      

  11. 你可以反编译下美丽说的apk看看,他们用的基本都是自定义的View。  为了节省内存,他们会在每次滚动后判断该图片是否还在屏幕内,不在就释放掉。
      

  12. 是啊,自定义的veiw,兄台有没有办法
      

  13. 解决这个问题,主要有三个方面,1软引用 2后台读取图片(如果图片是从网上读取的话) 3缓存图片到SD卡部分代码如下(我的是ExpandableListView):
    SoftReference<Bitmap> bitmap = null;//软 引用
    if(iconName != null && !iconName.equals("")) {
    childViewHolder.gameIconImage.setTag(iconName);
    bitmap = new SoftReference<Bitmap>(bitmaputil.getFileImage(EVENTICONPREURLPATH + iconName));//bitmaputil.getFileImage为从sd卡上取图片  if (null == bitmap || null == bitmap.get()) {
    AsyncImageLoader asyncImageLoader = new AsyncImageLoader(
    context, childViewHolder.gameIconImage);
    asyncImageLoader.execute(EVENTICONPREURLPATH + iconName);//如果sd卡上不存在该图片 启动后台进程从网上读取图片 同时缓存的sd卡上
    } else {
    childViewHolder.gameIconImage.setImageBitmap(bitmap.get());
    }

      

  14. 软引用的前提是没有view用这些图片数据,view是可以重用的
      

  15. android图片缓存 (1).使用简单 (2).轻松获取及预取新图片 (3).可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (4).省流量性能佳(有且仅有一个线程获取图片) (5).支持不同类型网络处理 (6).可根据系统配置初始化缓存 (7).扩展性强 (8).支持队列 (9).包含map的大多数接口。 可见:http://www.trinea.cn/?p=704
      

  16. 可以看看这个例子 http://pan.baidu.com/s/1dD5sxTf
      

类似问题 »