销毁时释放特定 Activity 的内存
Release Memory of Particular Activity when it is Destroyed
我有一个启动器 Activity
可以在打开时加载大位图并调整其大小作为背景。
只要点击后退按钮,Activity
就是 destroyed
。但是我认为内存还没有释放。
当我重新打开应用程序时,点击后退按钮并再次打开它(重复),我会得到一个 OutOfMemoryError
。
对于这个新手问题,我很抱歉,但我想知道 当 Activity
为 destroyed
时如何释放内存?
@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: FATAL EXCEPTION: main
Process: id.testingapp.android.TestingApp, PID: 30885
java.lang.OutOfMemoryError: Failed to allocate a 26211852 byte allocation with 14018312 free bytes and 13MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:939)
at android.graphics.Bitmap.createBitmap(Bitmap.java:912)
at android.graphics.Bitmap.createBitmap(Bitmap.java:843)
at 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)
at android.app.Activity.performCreate(Activity.java:6283)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)
at android.app.ActivityThread.access0(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
at 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();
}
尝试将位图设置为空,同时 activity 被销毁,如果需要 运行 垃圾收集器。
将此添加到您的代码中
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK))
{
finish();
}
return super.onKeyDown(keyCode, event);
}
为其添加以下代码
@Override
protected void onDestroy() {
//android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
if(scaledBitmap!=null)
{
scaledBitmap.recycle();
scaledBitmap=null;
}
}
即使在通过调用 finish() 销毁 activity 之后,它的资源也会排队等待垃圾回收。 activity 将在下一个 GC 周期中释放。
@Override
public void onDestroy() {
super.onDestroy();
Runtime.getRuntime().gc();
}
您还可以使用 android:largeHeap="true"
在清单中的应用程序标记中请求更大的堆大小。
尝试在按下后退按钮时完成 activity
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
在 activity 中,如果您从中调用 finish()
方法,并且 它的所有资源都在排队等待垃圾回收。
因此,此 activity 使用的所有内存将在下一个 GC 周期中释放。
或
你可以试试这个来清理内存,
@Override
public void onDestroy() {
super.onDestroy();
Runtime.getRuntime().gc();
}
检查。希望有帮助。
完成 Activity 不会清除其内存。它只会从其堆栈中删除 Activity,Android 将在需要内存时清除其内存(垃圾收集),如果您遇到 drawable 的内存问题,
- 减小可绘制对象的大小可能会解决您的问题。
- Android 设备内存不足也会导致内存问题。
我有一个启动器 Activity
可以在打开时加载大位图并调整其大小作为背景。
只要点击后退按钮,Activity
就是 destroyed
。但是我认为内存还没有释放。
当我重新打开应用程序时,点击后退按钮并再次打开它(重复),我会得到一个 OutOfMemoryError
。
对于这个新手问题,我很抱歉,但我想知道 当 Activity
为 destroyed
时如何释放内存?
@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: FATAL EXCEPTION: main Process: id.testingapp.android.TestingApp, PID: 30885 java.lang.OutOfMemoryError: Failed to allocate a 26211852 byte allocation with 14018312 free bytes and 13MB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) at android.graphics.Bitmap.nativeCreate(Native Method) at android.graphics.Bitmap.createBitmap(Bitmap.java:939) at android.graphics.Bitmap.createBitmap(Bitmap.java:912) at android.graphics.Bitmap.createBitmap(Bitmap.java:843) at 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) at android.app.Activity.performCreate(Activity.java:6283) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758) at android.app.ActivityThread.access0(ActivityThread.java:177) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5942) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) at 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();
}
尝试将位图设置为空,同时 activity 被销毁,如果需要 运行 垃圾收集器。
将此添加到您的代码中
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK))
{
finish();
}
return super.onKeyDown(keyCode, event);
}
为其添加以下代码
@Override
protected void onDestroy() {
//android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
if(scaledBitmap!=null)
{
scaledBitmap.recycle();
scaledBitmap=null;
}
}
即使在通过调用 finish() 销毁 activity 之后,它的资源也会排队等待垃圾回收。 activity 将在下一个 GC 周期中释放。
@Override
public void onDestroy() {
super.onDestroy();
Runtime.getRuntime().gc();
}
您还可以使用 android:largeHeap="true"
在清单中的应用程序标记中请求更大的堆大小。
尝试在按下后退按钮时完成 activity
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
在 activity 中,如果您从中调用 finish()
方法,并且 它的所有资源都在排队等待垃圾回收。
因此,此 activity 使用的所有内存将在下一个 GC 周期中释放。
或
你可以试试这个来清理内存,
@Override
public void onDestroy() {
super.onDestroy();
Runtime.getRuntime().gc();
}
检查
完成 Activity 不会清除其内存。它只会从其堆栈中删除 Activity,Android 将在需要内存时清除其内存(垃圾收集),如果您遇到 drawable 的内存问题,
- 减小可绘制对象的大小可能会解决您的问题。
- Android 设备内存不足也会导致内存问题。