我有一个应用程序,其布局中包含(大部分)图像。据我了解,Android应该在不再需要活动时释放内存。因此,当Activity手动执行onPause()时,我不会释放我的应用程序布局使用的Drawable。我知道Android应该这样做。
然后,我使用此代码检查内存状态:
{
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
android.app.ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
Log.i("MEMCHECK", " memoryInfo.availMem " + memoryInfo.availMem + "\n" );
Log.i("MEMCHECK", " memoryInfo.lowMemory " + memoryInfo.lowMemory + "\n" );
Log.i("MEMCHECK", " memoryInfo.threshold " + memoryInfo.threshold + "\n" );
android.os.Debug.MemoryInfo[] memoryInfoArray = activityManager.getProcessMemoryInfo(pids);
for(android.os.Debug.MemoryInfo pidMemoryInfo: memoryInfoArray) {
Log.i("MEMCHECK", " pidMemoryInfo.getTotalPrivateDirty(): " + pidMemoryInfo.getTotalPrivateDirty() + "\n");
Log.i("MEMCHECK", " pidMemoryInfo.getTotalPss(): " + pidMemoryInfo.getTotalPss() + "\n");
Log.i("MEMCHECK", " pidMemoryInfo.getTotalSharedDirty(): " + pidMemoryInfo.getTotalSharedDirty() + "\n");
}
在每个创建的活动上,内存占用增长(堆 - getTotalPrivateDirty())。我不想这样做,因为我的应用程序中的每个“kb”内存都非常重要。
此外,处理此回调时:
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] imageData, Camera c) {
}
}
空,就像那样。堆从10MB增长到20MB。 100%。这是正常的吗?怎么避免?
答案 0 :(得分:1)
对于图像和回调,您需要手动释放内存,而不是依赖于垃圾收集器。 您还需要注意视图的上下文。而可能在最低级别分配上下文,例如,如果视图仅在活动中使用,则为其分配活动上下文,如果仅在视图中使用侦听器/回调,则为其分配视图上下文。
您也可以手动取消绑定xml drawables。
答案 1 :(得分:0)
如果其他应用需要内存,Android将终止onPause和onStop上未使用的活动。您可以覆盖onPause或onStop以手动释放内存。
答案 2 :(得分:0)
我认为活动的内存一旦被破坏就会自动清理,调用完成()并在新活动(简单)中检查你的记忆以确认
答案 3 :(得分:-1)
尝试尽可能多地使用静态和最终变量,这样可以节省大量内存;)