it-swarm.com.de

Speicher für bestimmte Aktivitäten freigeben, wenn sie zerstört wird

Ich habe einen Launcher Activity, der große Bitmap als Hintergrund lädt, wenn sie geöffnet wird.

Wenn Sie die Zurück-Taste drücken, ist Activitydestroyed. Aber ich denke, die Erinnerung ist noch nicht freigegeben. 

Wenn ich die App wieder öffne, die Zurück-Taste drücke und sie erneut (wiederholt) öffne, erhalte ich eine OutOfMemoryError.

Es tut mir leid für diese Newbie-Frage, aber ich frage mich, wie kann ich den Speicher freigeben, wenn ein Activitydestroyed ist?

@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/Android-Laufzeit: FATALE AUSNAHME: main Prozess: id.testingapp.Android.TestingApp, PID: 30885 Java.lang.OutOfMemoryError: Fehler beim Zuweisen einer 26211852-Byte-Zuordnung mit 14018312 freien Bytes und 13 MB bis OOM at dalvik.system.VMRuntime.newNonMovableArray (native Methode) bei Android.graphics.Bitmap.nativeCreate (Native-Methode) unter Android.graphics.Bitmap.createBitmap (Bitmap.Java:939) unter Android.graphics.Bitmap.createBitmap (Bitmap.Java:912) unter Android.graphics.Bitmap.createBitmap (Bitmap.Java:843) unter 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) bei Android.app.Activity.performCreate (Activity.Java:6283) bei Android.app.Instrumentation.callActivityOnCreate (Instrumentation.Java:1119) at Android.app.ActivityThread.performLaunchActivity (ActivityThread.Java:2646) at Android.app.ActivityThread.handleLaunchActivity (ActivityThread.Java:2758) bei Android.app.ActivityThread.access $ 900 (ActivityThread.Java:177) at Android.app.ActivityThread $ H.handleMessage (ActivityThread.Java:1448) bei Android.os.Handler.dispatchMessage (Handler.Java:102) unter Android.os.Looper.loop (Looper.Java:145) unter Android.app.ActivityThread.main (ActivityThread.Java:5942) at Java.lang.reflect.Method.invoke (Native Method) bei 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)

BEARBEITEN:

Ich habe versucht, all dies in onDestroyed() zu setzen, aber das Problem bleibt bestehen

@Override
protected void onDestroy() {
    finish();
    bitmapImage = null;
    scaledBitmap = null;
    super.onDestroy();
    Runtime.getRuntime().gc();
    System.gc();
}
19
JayVDiyk

Füge folgenden Code hinzu

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

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

     }
11

In Aktivität, wenn Sie die finish()-Methode aufrufen, wird zerstört, und alle Ressourcen werden für die Speicherbereinigung in die Warteschlange gestellt. 

Daher wird der gesamte Speicher, der von dieser Aktivität verwendet wurde, im nächsten GC-Zyklus freigegeben.

OR

sie können dies zum Reinigen des Speichers versuchen,

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

check diese Details . hoffentlich hilft das.

7
Amit Vaghela

fügen Sie dies Ihrem Code hinzu

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

selbst nach dem Zerstören der Aktivität durch Aufrufen von finish () werden die Ressourcen für die Garbage Collection in die Warteschlange gestellt. Die Aktivität wird im nächsten GC-Zyklus freigegeben.

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

Sie können auch Android:largeHeap="true" verwenden, um in Ihrem Anwendungstag im Manifest eine größere Heap-Größe anzufordern.

2
Androider

Versuchen Sie, die Bitmap auf null zu setzen, während die Aktivität zerstört wird und der Garbage Collector ausgeführt wird.

2
ajantha

versuchen Sie, die Aktivität zu beenden, indem Sie die Zurück-Taste drücken

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

Beim Beenden einer Aktivität wird der Speicher nicht gelöscht. Es entfernt nur die Aktivität von seinem Stapel, Android löscht seinen Speicher, wenn es Speicher benötigt (Speicherbereinigung). 

  • Das Reduzieren der Zeichengröße kann Ihr Problem lösen.
  • Unzureichender Speicher in Android-Geräten führt ebenfalls zu Speicherproblemen.
0
Anbarasu Chinna