在销毁时释放特定活动的内存

时间:2015-12-22 06:14:37

标签: android android-studio out-of-memory android-bitmap android-memory

我有一个启动程序Activity,可以在打开时加载并调整大位图的大小。

每当点击后退按钮时,Activitydestroyed。但我认为记忆尚未公布。

当我打开应用程序时,点击后退按钮再次打开它(反复),我会得到OutOfMemoryError

我很抱歉这个新手问题,但我想知道如果Activitydestroyed,我该如何释放内存?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_welcome);

    //MARK - movingBackgroundImageView
    movingBackgroundImageView = (ImageView) findViewById(R.id.movingBackgroundImageView);
    movingBackgroundImageView.setColorFilter(Color.argb(255, 255, 255, 255));
    movingBackgroundImageView.setScaleType(ImageView.ScaleType.MATRIX);
    movingBackgroundImageView.setAlpha(0.28f);

    prepareBackgroundAnimation();
}

private void prepareBackgroundAnimation() {

    DisplayMetrics displaymetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);

    screenWidth = displaymetrics.widthPixels;
    screenHeight = displaymetrics.heightPixels;

    movingImageHeight = displaymetrics.heightPixels;
    movingImageWidth = 1920.0 / 1080.0 * movingImageHeight;

    bitmapImage = BitmapFactory.decodeResource(this.getResources(), R.drawable.moving_background_image);
    scaledBitmap = bitmapImage.createScaledBitmap(bitmapImage, (int) movingImageWidth, (int) movingImageHeight, false);
    movingBackgroundImageView.setImageBitmap(scaledBitmap);

    backgroundImageInBeginning = true;

    movingBackgroundImageView.post(new Runnable() {
        @Override
        public void run() {
            movingBackgroundImageView.setImageMatrix(matrix);
            moveBackground();
        }
    });
}
  

12-22 13:44:49.549 30885-30885 /? E / AndroidRuntime:致命异常:主要           过程:id.testingapp.android.TestingApp,PID:30885           java.lang.OutOfMemoryError:无法分配26211852字节分配14018312个空闲字节和13MB直到OOM           at dalvik.system.VMRuntime.newNonMovableArray(Native Method)           在android.graphics.Bitmap.nativeCreate(本机方法)           在android.graphics.Bitmap.createBitmap(Bitmap.java:939)           在android.graphics.Bitmap.createBitmap(Bitmap.java:912)           在android.graphics.Bitmap.createBitmap(Bitmap.java:843)           在android.graphics.Bitmap.createScaledBitmap(Bitmap.java:719)           at id.testingapp.android.TestingApp.WelcomeActivity.prepareBackgroundAnimation(WelcomeActivity.java:140)           at id.TestingApp.android.TestingApp.WelcomeActivity.onCreate(WelcomeActivity.java:72)           在android.app.Activity.performCreate(Activity.java:6283)           在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)           在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)           在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)           在android.app.ActivityThread.access $ 900(ActivityThread.java:177)           在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1448)           在android.os.Handler.dispatchMessage(Handler.java:102)           在android.os.Looper.loop(Looper.java:145)           在android.app.ActivityThread.main(ActivityThread.java:5942)           at java.lang.reflect.Method.invoke(Native Method)           在java.lang.reflect.Method.invoke(Method.java:372)           在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1400)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)

修改

我试图将所有这些放在onDestroyed()中,但问题仍然存在

@Override
protected void onDestroy() {
    finish();
    bitmapImage = null;
    scaledBitmap = null;
    super.onDestroy();
    Runtime.getRuntime().gc();
    System.gc();
}

7 个答案:

答案 0 :(得分:13)

为其添加以下代码

@Override
protected void onDestroy() {
    //android.os.Process.killProcess(android.os.Process.myPid());

    super.onDestroy();
    if(scaledBitmap!=null)
            {
                scaledBitmap.recycle();
                scaledBitmap=null;
            }

     }

答案 1 :(得分:7)

在活动中,如果您正在调用finish()方法,则会销毁所有资源排队等待垃圾回收。

因此,此活动使用的所有内存将在下一个GC周期中释放

OR

你可以尝试这个来清理记忆,

@Override
public void onDestroy() {
    super.onDestroy();
    Runtime.getRuntime().gc();      
}

检查 this details。希望有所帮助。

答案 2 :(得分:2)

尝试在活动被销毁时将位图设置为null,并且如果需要运行垃圾收集器。

答案 3 :(得分:2)

将此添加到您的代码

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if ((keyCode == KeyEvent.KEYCODE_BACK))
    {
        finish();
    }
    return super.onKeyDown(keyCode, event);
}

答案 4 :(得分:2)

即使在通过调用finish()销毁活动之后,它的资源也会排队等待垃圾回收。活动将在下一个GC周期中被释放。

@Override
public void onDestroy() {
    super.onDestroy();
    Runtime.getRuntime().gc();      
}

您还可以使用android:largeHeap="true"在清单中的应用程序标记中请求更大的堆大小。

答案 5 :(得分:1)

按下后退按钮

时尝试完成活动
@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}

答案 6 :(得分:0)

完成活动不会清除其记忆。它只从其堆栈中删除Activity,Android将在需要内存时清除其内存(垃圾回收),如果你面临来自drawable的内存问题,

  • 减少可绘制的尺寸可以解决您的问题。
  • Android设备内存不足也会导致内存问题。