gpt4 book ai didi

java - 如何判断您的 Activity 距离达到其内存限制有多近?

转载 作者:太空狗 更新时间:2023-10-29 13:42:35 25 4
gpt4 key购买 nike

我正在为 Android 编写一个图形设计应用程序,用户可以在其中向文档添加多个图像,其中每个图像都存储为一个位图对象。每个位图的尺寸大约为 800x400 像素,并使用 ARGB8888 像素格式(即每个约 1.5Mb)。

我知道大多数第一代 Android 设备都有 16Mb 的堆限制,而对于较新的手机,此限制为 24Mb 或更大。我也知道位图内存是在外部分配的,但我很困惑,这意味着什么。

我的问题是:我如何在运行时判断添加新位图是否会太接近内存限制?

在有人建议“不要使用那么多内存”之前,我知道我有一个选择是限制用户可以创建的位图数量,这样我就知道这个限制对于最基本的 Android 手机来说是安全的。但是,我希望内存限制更大的手机能够支持更多位图和/或更大的位图。

我知道在分配位图时检查 OutOfMemory 异常。然而,在某些情况下,我只剩下足够的内存来分配一个位图。在此之后,整个应用程序将变得不稳定,因为即使分配像字符串这样的小东西也可能导致 OutOfMemory 异常。这是我想避免的事情。

我不确定如何定义“太接近内存限制”,但我怀疑像“不要将超过一半的可用内存分配给位图”这样的东西可以正常工作,因为我存储的其他数据结构相比之下,内存中的空间很小。

最佳答案

使用此方法记录已用内存,但我已将其发布到

Android: out of memory exception in Gallery

请参阅该帖子以获得进一步的解释。

public static void logHeap(Class clazz) {
Double allocated = new Double(Debug.getNativeHeapAllocatedSize())/1048576.0);
Double available = new Double(Debug.getNativeHeapSize())/1048576.0);
Double free = new Double(Debug.getNativeHeapFreeSize())/1048576.0);
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
df.setMinimumFractionDigits(2);

Log.d(APP, "debug. =================================");
Log.d(APP, "debug.heap native: allocated " + df.format(allocated) + "MB of " + df.format(available) + "MB (" + df.format(free) + "MB free) in [" + clazz.getName().replaceAll("com.myapp.android.","") + "]");
Log.d(APP, "debug.memory: allocated: " + df.format(new Double(Runtime.getRuntime().totalMemory()/1048576.0)) + "MB of " + df.format(new Double(Runtime.getRuntime().maxMemory()/1048576.0))+ "MB (" + df.format(new Double(Runtime.getRuntime().freeMemory()/1048576.0)) +"MB free)");
System.gc();
System.gc();

// don't need to add the following lines, it's just an app specific handling in my app
if (allocated>=(new Double(Runtime.getRuntime().maxMemory())/1048576.0)-MEMORY_BUFFER_LIMIT_FOR_RESTART)) {
android.os.Process.killProcess(android.os.Process.myPid());
}
}

关于java - 如何判断您的 Activity 距离达到其内存限制有多近?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3943468/

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