gpt4 book ai didi

Android:内存不足错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:22 24 4
gpt4 key购买 nike

当我将我的 Android 应用程序最小化大约 4 或 5 次时,我总是会收到以下错误:

02-01 19:24:11.980: E/dalvikvm-heap(22362): Out of memory on a 3686416-byte allocation.
02-01 19:24:12.000: E/dalvikvm(22362): Out of memory: Heap Size=62755KB, Allocated=55237KB, Limit=65536KB
02-01 19:24:12.000: E/dalvikvm(22362): Extra info: Footprint=62435KB, Allowed Footprint=62755KB, Trimmed=2144KB
02-01 19:24:12.000: E/Bitmap_JNI(22362): Create Bitmap Failed.
02-01 19:24:12.000: E/Bitmap_JNI(22362): Failed to create SkBitmap!
02-01 19:24:12.000: E/AndroidRuntime(22362): FATAL EXCEPTION: main
02-01 19:24:12.000: E/AndroidRuntime(22362): java.lang.OutOfMemoryError: (Heap Size=62755KB, Allocated=55237KB)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.graphics.Bitmap.nativeCreateScaledBitmap(Native Method)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:744)
02-01 19:24:12.000: E/AndroidRuntime(22362): at de.vauge.mb.Utils.getResizedBitmap(Utils.java:56)
02-01 19:24:12.000: E/AndroidRuntime(22362): at de.vauge.mb.MenuView.initialize(MenuView.java:74)
02-01 19:24:12.000: E/AndroidRuntime(22362): at de.vauge.mb.MenuView$1.handleMessage(MenuView.java:137)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.os.Handler.dispatchMessage(Handler.java:99)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.os.Looper.loop(Looper.java:156)
02-01 19:24:12.000: E/AndroidRuntime(22362): at android.app.ActivityThread.main(ActivityThread.java:5045)
02-01 19:24:12.000: E/AndroidRuntime(22362): at java.lang.reflect.Method.invokeNative(Native Method)
02-01 19:24:12.000: E/AndroidRuntime(22362): at java.lang.reflect.Method.invoke(Method.java:511)
02-01 19:24:12.000: E/AndroidRuntime(22362): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-01 19:24:12.000: E/AndroidRuntime(22362): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-01 19:24:12.000: E/AndroidRuntime(22362): at dalvik.system.NativeStart.main(Native Method)

我的应用程序只包含一个 Activity ,其中有 7 个不同的、自写的 View (所有 View 都包含一些位图),并且在不需要时切换为不可见(可能不是很好的风格,但它适用于我到现在...)。这些 View 中的每一个都有一个 destroy() 函数,该函数回收其中使用的所有位图,并且 MainActivity 的 onDestroy() 调用所有这些 destroy() 函数。此外,我没有使用任何静态位图。

那么,除了回收所有 Bitmap 和不使用静态 Bitmap 之外,还有什么我可以尝试的吗?

最佳答案

嗯。 Android 上的位图可能有点棘手。您能否提供有关位图来源及其大小的更好信息?

否则,我建议您查看以下内容:

  1. 如果您要加载远程图像,请查看 fresco .您也可以查看 Picasso .我个人以前喜欢ImageLoader , 但它不再被维护。

  2. 如果您使用的 inPurgable 标志曾经是推荐的选项,请尝试找到解决方法,因为它实际上会导致为每个图像分配更多内存。

  3. 如果您经常解码小型本地 Assets ,请考虑将您的可绘制对象保存在 HashMap 中,并在需要时重复使用它们。更少的 GC。

  4. 如果您希望对您的应用程序进行子类化,您可以使用 OnLowMemory打电话知道什么时候你可能真的需要清理(主要是为了调试,而不是现实生活中的情况)......如果那还不算太晚......:)

  5. 查看 Chris Banes 的博客。 This是一个非常有趣的内存缓存解决方案

  6. 实现您在需要和可能时调用的内存修剪器。

  7. 另一个意料之中的优化是在可能的情况下使用较小的对象...想想您的最小数据模型和图像大小,并尝试为它们提供一个符合标准的 API。

关于Android:内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14652836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com