web-dev-qa-db-ja.com

破壊された特定のアクティビティのメモリを解放する

大きなビットマップを開いたときに背景としてロードおよびサイズ変更するランチャー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: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();
}
_
20
JayVDiyk

次のコードを追加してください

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

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

     }
13

アクティビティでfinish()メソッドを呼び出している場合は破棄され、そのすべてのリソースはガベージコレクションのキューに入れられます。

したがって、このアクティビティで使用されていたすべてのメモリは、次のGCサイクル中に解放されます

OR

これを試してメモリを消去できます。

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

この詳細 を確認してください。それが役立つことを願っています。

7
Amit Vaghela

これをコードに追加します

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

finish()を呼び出してアクティビティを破棄した後でも、リソースはガベージコレクションのキューに入れられます。アクティビティは次のGCサイクル中に解放されます。

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

マニフェストのアプリケーションタグで、Android:largeHeap="true"を使用してより大きなヒープサイズを要求することもできます。

2
Androider

アクティビティが破棄されている間にビットマップをnullに設定し、必要に応じてガベージコレクタを実行してください。

2
ajantha

戻るボタンを押したときにアクティビティを終了してみてください

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

アクティビティを終了しても、メモリはクリアされません。スタックからアクティビティを削除するだけです。Androidは、メモリ(ガベージコレクション)が必要なときにメモリをクリアします。drawableからメモリの問題に直面した場合、

  • 描画可能なサイズを小さくすると、問題が解決する場合があります。
  • Androidデバイスのメモリ不足もメモリの問題につながります。
0
Anbarasu Chinna