【发布时间】:2013-11-11 16:59:25
【问题描述】:
我在显示一个显示所有已安装应用程序的对话框时得到了这个
E/AndroidRuntime( 1148): java.lang.OutOfMemoryError
E/AndroidRuntime( 1148): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime( 1148): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
E/AndroidRuntime( 1148): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
E/AndroidRuntime( 1148): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:832)
E/AndroidRuntime( 1148): at android.content.res.Resources.loadDrawable(Resources.java:2988)
E/AndroidRuntime( 1148): at android.content.res.Resources.getDrawable(Resources.java:1558)
E/AndroidRuntime( 1148): at android.app.ApplicationPackageManager.getDrawable(ApplicationPackageManager.java:712)
E/AndroidRuntime( 1148): at android.content.pm.PackageItemInfo.loadIcon(PackageItemInfo.java:149)
E/AndroidRuntime( 1148): at android.content.pm.ComponentInfo.loadDefaultIcon(ComponentInfo.java:167)
E/AndroidRuntime( 1148): at android.content.pm.PackageItemInfo.loadIcon(PackageItemInfo.java:154)
E/AndroidRuntime( 1148): at android.content.pm.ResolveInfo.loadIcon(ResolveInfo.java:226)
在对话框中,我正在遍历ResolveInfo 中的List,并通过以下方式加载应用程序图标:
Drawable app_icon = allappslist.get(i).loadIcon(context.getPackageManager()));
但这有时会产生上述错误...
【问题讨论】:
-
使用 MAT 找出你的记忆去向。
-
hmm 我查了一下,所有的drawable都存储在vm堆中,如果有一定数量的应用程序,分配的内存太多了,我该怎么办?为什么其他应用程序(如 apex 启动器,...)不会出现这种与已安装应用程序数量无关的内存错误?
-
“那我该怎么办?” -- 修复应用中其他地方的内存问题。应用程序图标可能是“压死骆驼的最后一根稻草”,但它们可能就是这样。如果 MAT 向您显示这些图标单独占用了数十 MB 的堆空间,那么您遇到了这些图标独有的问题。否则,您的问题就出在您应用的其他地方。
-
是的,所有 100 多个应用程序图标都加载到堆空间中,在 20 号左右之后它会崩溃……你知道我怎样才能从堆中取出 thwm 吗??
标签: java android bitmap out-of-memory drawable