Android - 几乎没有与内存相关的问题

时间:2012-01-11 09:32:38

标签: java android memory

我有一个应用程序,其布局中包含(大部分)图像。据我了解,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%。这是正常的吗?怎么避免?

4 个答案:

答案 0 :(得分:1)

对于图像和回调,您需要手动释放内存,而不是依赖于垃圾收集器。 您还需要注意视图的上下文。而可能在最低级别分配上下文,例如,如果视图仅在活动中使用,则为其分配活动上下文,如果仅在视图中使用侦听器/回调,则为其分配视图上下文。

您也可以手动取消绑定xml drawables。

答案 1 :(得分:0)

如果其他应用需要内存,Android将终止onPause和onStop上未使用的活动。您可以覆盖onPause或onStop以手动释放内存。

答案 2 :(得分:0)

我认为活动的内存一旦被破坏就会自动清理,调用完成()并在新活动(简单)中检查你的记忆以确认

答案 3 :(得分:-1)

尝试尽可能多地使用静态和最终变量,这样可以节省大量内存;)