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

我有一个启动器Activity ,可以加载并调整大位图的大小,因为它是打开时的背景。

只要点击后退按钮, Activity就会被destroyed 。 但我认为记忆尚未公布。

当我打开应用程序时,点击后退按钮再次打开它(反复),我将得到一个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:FATAL EXCEPTION:main进程:id.testingapp.android.TestingApp,PID:30885 java.lang.OutOfMemoryError:无法在dalvik.system.VMRuntime.newNonMovableArray中分配带有14018312个空闲字节和13MB的26211852字节分配(Native方法)在android.graphics.Bitmap.createBitmap(Bitmap.java:939)的android.graphics.Bitmap.nativeCreate(Native Method)android.graphics.Bitmap.createBitmap(Bitmap.java:912)android.graphics位于id.TestingApp的id.testingapp.android.TestingApp.WelcomeActivity.prepareBackgroundAnimation(WelcomeActivity.java:140)的android.graphics.Bitmap.createScaledBitmap(Bitmap.java:719)上的.bitmap.createBitmap(Bitmap.java:843)。 android.TestingApp.WelcomeActivity.onCreate(WelcomeActivity.java:72)位于android.app.AseCreate(Activity.java:6283)的android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)android.app.ActivityThread android.app.ActivityThread.ha中的.performLaunchActivity(ActivityThread.java:2646) 在Android.app.Handler.dispatchMessage上的android.app.ActivityThread.access $ 900(ActivityThread.java:177)的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1448)的ndleLaunchActivity(ActivityThread.java:2758) Handler.java:102)在android.app.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)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(); } 

为它添加以下代码

 @Override protected void onDestroy() { //android.os.Process.killProcess(android.os.Process.myPid()); super.onDestroy(); if(scaledBitmap!=null) { scaledBitmap.recycle(); scaledBitmap=null; } } 

在活动中,如果您正在调用finish()方法,则将销毁,并将其所有资源排入队列以进行垃圾回收。

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

要么

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

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

查看此详细信息 。 希望有所帮助。

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

将此添加到您的代码中

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

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

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

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

按下后退按钮时尝试完成活动

 @Override public void onBackPressed() { super.onBackPressed(); finish(); } 

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

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