Android加载一百张大图片,列表显示,怎么保证不会OOM
Android加载一百张大图片,列表显示,如何保证不会OOM?
图片从网络获取,大小都是1024*768的大图,要求滑动展示,如何做到不会OOM?
大牛们有什么好的建议吗?
------解决方案--------------------
显示缩略图吧,那么大的图多吃内存哦。
------解决方案--------------------
判断滑动事件,滑动时不加载图片
及时回收
也只能这样了。。
------解决方案--------------------
只能这样了
------解决方案--------------------
我是来听高见。
------解决方案--------------------
其实没啥高见的,那么大尺寸的图片,到内存里只看分辨率大小,你可以考虑最终设备的RAM在2GB或4GB,一个图片占用率内存 为分辨率的长x宽x4 计算,你就明白了。回收内存用弱引用让JVM管理吧。
------解决方案--------------------
哎。。好久没来论坛了。
这个问题。其实很简单。
3部曲
1:软引用。耗吧,我说这个基本没啥用。就是防止挂掉,还是看不了图片的。
2:我还是放代码。
图片从网络获取,大小都是1024*768的大图,要求滑动展示,如何做到不会OOM?
大牛们有什么好的建议吗?
------解决方案--------------------
显示缩略图吧,那么大的图多吃内存哦。
------解决方案--------------------
判断滑动事件,滑动时不加载图片
及时回收
也只能这样了。。
------解决方案--------------------
只能这样了
------解决方案--------------------
我是来听高见。
------解决方案--------------------
其实没啥高见的,那么大尺寸的图片,到内存里只看分辨率大小,你可以考虑最终设备的RAM在2GB或4GB,一个图片占用率内存 为分辨率的长x宽x4 计算,你就明白了。回收内存用弱引用让JVM管理吧。
------解决方案--------------------
哎。。好久没来论坛了。
这个问题。其实很简单。
3部曲
1:软引用。耗吧,我说这个基本没啥用。就是防止挂掉,还是看不了图片的。
2:我还是放代码。
- Java code
public static Bitmap loadImageFromUrl(String url, int sc) { URL m; InputStream i = null; BufferedInputStream bis = null; ByteArrayOutputStream out = null; byte isBuffer[] = new byte[1024]; if (url == null) return null; try { m = new URL(url); i = (InputStream) m.getContent(); bis = new BufferedInputStream(i, 1024 * 4); out = new ByteArrayOutputStream(); int len = 0; while ((len = bis.read(isBuffer)) != -1) { out.write(isBuffer, 0, len); } out.close(); bis.close(); } catch (MalformedURLException e1) { e1.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); } if (out == null) return null; byte[] data = out.toByteArray(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeByteArray(data, 0, data.length, options); options.inJustDecodeBounds = false; int be = (int) (options.outHeight / (float) sc); if (be <= 0) { be = 1; } else if (be > 3) { be = 3; } options.inSampleSize = be; Bitmap bmp = null; try { bmp = BitmapFactory.decodeByteArray(data, 0, data.length, options); // 返回缩略图 } catch (OutOfMemoryError e) { // TODO: handle exception System.gc(); bmp = null; } return bmp; }
------解决方案--------------------
------解决方案--------------------
是否可以考虑,下载到本地文件系统做缓存的情况。 只是需要定期清理磁盘。
------解决方案--------------------
------解决方案--------------------
分页加载,先加载能够显示的界面图,及时回收浏览后不再显示的图片,只能这样了,没有太好的方法了。
------解决方案--------------------
“保证”只能用在静物比较适合,Android的兼容性是一个超大的问题。