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);
}