samsung nada memoria liberar interno interna espacio cómo como celular borrar almacenamiento android android-studio out-of-memory android-bitmap android-memory

android - nada - Liberar memoria de actividad particular cuando se destruye.



liberar espacio android (7)

Tengo una Activity inicio que carga y cambia el tamaño del mapa de bits grande como fondo cuando se abre.

Cada vez que se pulsa el botón Atrás, la Activity se destroyed . Pero creo que la memoria no se ha lanzado todavía.

Cuando abro la aplicación, presiona el botón Atrás y la abro nuevamente (repetidamente), obtendré un OutOfMemoryError .

Lo siento por esta pregunta de novato, pero me pregunto ¿cómo puedo liberar la memoria cada vez que se destroyed una Activity ?

@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: EXCEPCIÓN FATAL: Proceso principal: id.testingapp.android.TestingApp, PID: 30885 java.lang.OutOfMemoryError: No se pudo asignar una asignación de 26211852 bytes con 14018312 bytes libres y 13MB hasta OOM en dalvik.sistemaP.P. (Método nativo) en android.graphics.Bitmap.nativeCreate (Método nativo) en android.graphics.Bitmap.createBitmap (Bitmap.java:939) en android.graphics.Bitmap.createBitmap (Bitmap.java:912) en android.graphics .Bitmap.createBitmap (Bitmap.java:843) en android.graphics.Bitmap.createScaledBitmap (Bitmap.java:719) en id.testingapp.android.TestingApp.WelcomeActivity.prepareBackgroundAnimation (WelcomeActivity.pavas). android.TestingApp.WelcomeActivity.onCreate (WelcomeActivity.java:72) en android.app.Activity.performCreate (Activity.java:6283) en android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1119). .performLaunchActivity (ActivityThread.java:2646) en android.app.ActivityThread.ha ndleLaunchActivity (ActivityThread.java:2758) en android.app.ActivityThread.access $ 900 (ActivityThread.java:177) en android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1448) en android.os.HandlerMispatchMessage Handler.java:102) en android.os.Looper.loop (Looper.java:145) en android.app.ActivityThread.main (ActivityThread.java:5942) en java.lang.reflect.Method.invoke (Método nativo) en java.lang.reflect.Method.invoke (Method.java:372) en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1400) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1195)

EDITAR:

He intentado poner todo esto en onDestroyed() pero el problema persiste

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


Añade el siguiente código para ello

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


En actividad si está llamando al método finish() se destruye y todos sus recursos se ponen en cola para la recolección de basura.

Por lo tanto, toda la memoria utilizada por esta actividad se liberará durante el próximo ciclo de GC .

O

Puedes intentar esto para limpiar la memoria,

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

Revisa estos detalles . Espero que ayude.


Incluso después de destruir la actividad llamando a finish (), sus recursos se ponen en cola para la recolección de basura. La actividad será liberada durante el próximo ciclo de GC.

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

También puede usar android:largeHeap="true" para solicitar un tamaño de pila más grande, en su etiqueta de aplicación en el manifiesto.


Intenta terminar la actividad presionando el botón Atrás.

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


Intente establecer el mapa de bits en nulo mientras se destruye la actividad y, si lo desea, ejecute el recolector de basura.


Terminar una actividad no borra su memoria. Solo elimina la Actividad de su pila, Android borrará su memoria cuando necesite memoria (recolección de basura), si se enfrenta a un problema de memoria por uso,

  • Reducir el tamaño extraíble puede resolver su problema.
  • La memoria insuficiente en los dispositivos Android también conduce a problemas de memoria.

agrega esto a tu código

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