大きなビットマップを開いたときに背景としてロードおよびサイズ変更するランチャー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:dalvik.system.VMRuntime.newNonMovableArrayでのOOMまで、14018312の空きバイトと13MBの26211852バイト割り当ての割り当てに失敗しました(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.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1119)のAndroid.app.Activity.performCreate(Activity.Java:6283)のAndroid.TestingApp.WelcomeActivity.onCreate(WelcomeActivity.Java:72)Android.app.ActivityThreadの.performLaunchActivity(ActivityThread.Java:2646)at Android.app.ActivityThread.ha ndleLaunchActivity(ActivityThread.Java:2758)at Android.app.ActivityThread.access $ 900(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) 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();
}
_
次のコードを追加してください
@Override
protected void onDestroy() {
//Android.os.Process.killProcess(Android.os.Process.myPid());
super.onDestroy();
if(scaledBitmap!=null)
{
scaledBitmap.recycle();
scaledBitmap=null;
}
}
アクティビティでfinish()
メソッドを呼び出している場合は破棄され、そのすべてのリソースはガベージコレクションのキューに入れられます。
したがって、このアクティビティで使用されていたすべてのメモリは、次のGCサイクル中に解放されます。
OR
これを試してメモリを消去できます。
@Override
public void onDestroy() {
super.onDestroy();
Runtime.getRuntime().gc();
}
この詳細 を確認してください。それが役立つことを願っています。
これをコードに追加します
@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"
を使用してより大きなヒープサイズを要求することもできます。
アクティビティが破棄されている間にビットマップをnullに設定し、必要に応じてガベージコレクタを実行してください。
戻るボタンを押したときにアクティビティを終了してみてください
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
アクティビティを終了しても、メモリはクリアされません。スタックからアクティビティを削除するだけです。Androidは、メモリ(ガベージコレクション)が必要なときにメモリをクリアします。drawableからメモリの問題に直面した場合、