如何检测Android中的低内存?

我的应用程序有很多图像,有时由于内存不足而崩溃。 我写了我在开发者网站上find的这个函数。

public void onLowMemory(){ } 

但问题是这个函数在内存不足的情况下永远不会被调用。 我该怎么做才能使这个function被调用。 当设备内存不足时,我需要提醒用户。

Solutions Collecting From Web of "如何检测Android中的低内存?"

onLowMemory()并不是一个很大的帮助,因为只有在整个系统内存不足的情况下才会调用onLowMemory() ,而不是在应用程序的可用堆空间不足的情况下调用。

所以我的答案是你不应该依赖onLowMemory()被调用。 恕我直言,没有callback方法为您的问题。

您只需定期轮询可用的堆空间并检查是否内存不足。

 Runtime.getRuntime().maxMemory(); Runtime.getRuntime().totalMemory(); Runtime.getRuntime().freeMemory(); 

与监视系统内存的onLowMemory()onTrimMemory() ,这是一种监视应用程序内存的方法。 它使用Zsolt Safrany的核心答案。

 private final float CHECK_MEMORY_FREQ_SECONDS = 3.0f; private final float LOW_MEMORY_THRESHOLD_PERCENT = 5.0f; // Available % private Handler memoryHandler_; public void onCreate( Bundle savedInstanceState ) { // Do Stuff... // Start Monitoring App Memory Availablity memoryHandler_ = new Handler(); checkAppMemory(); } public void checkAppMemory(){ // Get app memory info long available = Runtime.getRuntime().maxMemory(); long used = Runtime.getRuntime().totalMemory(); // Check for & and handle low memory state float percentAvailable = 100f * (1f - ((float) used / available )); if( percentAvailable <= LOW_MEMORY_THRESHOLD_PERCENT ) handleLowMemory(); // Repeat after a delay memoryHandler_.postDelayed( new Runnable(){ public void run() { checkAppMemory(); }}, (int)(CHECK_MEMORY_FREQ_SECONDS * 1000) ); } public void handleLowMemory(){ // Free Memory Here } 

检查Android应用程序的内存分析。

我的应用程序有很多图像,有时由于内存不足而崩溃

如果您的应用程序正在从互联网下载任何图像或最终用户从图库中挑选图像并添加图像,那么这一部分并不清楚。 在这种情况下

  • 你可以警告用户,为了添加新的图像,他们必须退回一些已经采摘的图像
  • 或者更好的是你可以使用任何algorithm从内存中删除图像(最近最less使用/查看?)

    另一种情况是你的应用程序本身使用太多的内存,因为不必要的引用和泄漏..这种情况下,你从来没有警告用户,没有更多的内存..这是你有责任有效地使用内存…这种情况下,通常会出现主要是当

  • 你正在泄漏一个使用很多图像的视图/布局,在这种情况下,你必须找出泄漏并解决它。如果你正在使用eclipse阅读关于MAT
  • 很less当图像太大的大小..这是一个devise师的错误..你可以得到良好的外观和感觉与几千字节的大小的图像…

无论如何,提醒用户低内存是不明智的。程序员应该总是编程思考你可以通过使用更less的内存使应用程序更好。

这个线程将是非常有用的知道你的内存足迹inforamation ..

而关于MAT工具的用法…

这里是我如何使用onLowMemory,在MyApplication中实现的一个例子清理东西,我刷新内存caching(主要用于图像)和谷歌跟踪器;

 @Override public void onLowMemory() { super.onLowMemory(); Log.w(TAG, "onLowMemory() -> clearImageCacheFu!!!"); clearImageCacheFu(); dispatchGoogleTracker(); stopGoogleTracker(); } 

这可能会给你一个想法,以适应你的需要。 希望这可以帮助。

从API级别14开始,有一个名为onTrimMemory(int)的方法onTrimMemory(int)您的需求。

这里是文档:

http://developer.android.com/reference/android/content/ComponentCallbacks2.html

系统即将重新记忆内容时,系统会通知您当前的情况。