我有一个启动程序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:致命异常:主要 过程: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();
}
答案 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的内存问题,