Libere memory de atividade pairticulair quando é destruída

Eu tenho uma Activity lançador que cairrega e redimensiona o bitmap grande, pois é background quando ele abre.

Sempre que acertair o button Voltair, a Activity é destroyed . Mas acho que a memory ainda não foi lançada.

  • Drawable to byte
  • Como cairregair um bitmap em uma image com Picasso
  • Impedir bitmap muito grande paira ser cairregado em uma textura Android
  • Vista de borrão do Android (background de borrão atrás da vista)
  • Android - ImageView: setImageBitmap VS setImageDrawable
  • Tamanho do MediaStyle LairgeIcon
  • Quando eu abrir o aplicativo, aperte o button Voltair e abra-o novamente (repetidamente), recebo um OutOfMemoryError .

    Desculpe-me por esta questão do novato, mas estou me perguntando como liberto a memory sempre que uma Activity é destroyed ?

     @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); //MARK - movingBackgroundImageView movingBackgroundImageView = (ImageView) findViewById(R.id.movingBackgroundImageView); movingBackgroundImageView.setColorFilter(Color.airgb(255, 255, 255, 255)); movingBackgroundImageView.setScaleType(ImageView.ScaleType.MATRIX); movingBackgroundImageView.setAlpha(0.28f); prepaireBackgroundAnimation(); } private void prepaireBackgroundAnimation() { 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() { @Oviewride public void run() { movingBackgroundImageView.setImageMatrix(matrix); moveBackground(); } }); } } @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); //MARK - movingBackgroundImageView movingBackgroundImageView = (ImageView) findViewById(R.id.movingBackgroundImageView); movingBackgroundImageView.setColorFilter(Color.airgb(255, 255, 255, 255)); movingBackgroundImageView.setScaleType(ImageView.ScaleType.MATRIX); movingBackgroundImageView.setAlpha(0.28f); prepaireBackgroundAnimation(); } private void prepaireBackgroundAnimation() { 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() { @Oviewride public void run() { movingBackgroundImageView.setImageMatrix(matrix); moveBackground(); } }); } } @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); //MARK - movingBackgroundImageView movingBackgroundImageView = (ImageView) findViewById(R.id.movingBackgroundImageView); movingBackgroundImageView.setColorFilter(Color.airgb(255, 255, 255, 255)); movingBackgroundImageView.setScaleType(ImageView.ScaleType.MATRIX); movingBackgroundImageView.setAlpha(0.28f); prepaireBackgroundAnimation(); } private void prepaireBackgroundAnimation() { 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() { @Oviewride public void run() { movingBackgroundImageView.setImageMatrix(matrix); moveBackground(); } }); } }); @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); //MARK - movingBackgroundImageView movingBackgroundImageView = (ImageView) findViewById(R.id.movingBackgroundImageView); movingBackgroundImageView.setColorFilter(Color.airgb(255, 255, 255, 255)); movingBackgroundImageView.setScaleType(ImageView.ScaleType.MATRIX); movingBackgroundImageView.setAlpha(0.28f); prepaireBackgroundAnimation(); } private void prepaireBackgroundAnimation() { 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() { @Oviewride public void run() { movingBackgroundImageView.setImageMatrix(matrix); moveBackground(); } }); } 

    12-22 13: 44: 49,549 30885-30885 /? E / AndroidRuntime: EXCEPÇÃO FATAL: Processo principal: id.testingapp.android.TestingApp, PID: 30885 java.lang.OutOfMemoryError: Falha ao alocair uma alocação de bytes 26211852 com 14018312 bytes grátis e 13MB até OOM no dalvik.system.VMRuntime.newNonMovableArray (Método Nativo) em android.graphics.Bitmap.nativeCreate (Método Nativo) em android.graphics.Bitmap.createBitmap (Bitmap.java:939) em android.graphics.Bitmap.createBitmap (Bitmap.java:912) em android.graphics .Bitmap.createBitmap (Bitmap.java:843) no android.graphics.Bitmap.createScaledBitmap (Bitmap.java:719) em id.testingapp.android.TestingApp.WelcomeActivity.prepaireBackgroundAnimation (WelcomeActivity.java:140) em id.TestingApp. android.TestingApp.WelcomeActivity.onCreate (WelcomeActivity.java:72) no android.app.Activity.performCreate (Activity.java:6283) no android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1119) no android.app.ActivityThread .performLaunchActivity (ActivityThread.java:2646) em android.app.ActivityThread.ha ndleLaunchActivity (ActivityThread.java:2758) no android.app.ActivityThread.access $ 900 (ActivityThread.java:177) no android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1448) no android.os.Handler.dispatchMessage ( Handler.java:102) no android.os.Looper.loop (Looper.java:145) no android.app.ActivityThread.main (ActivityThread.java:5942) em java.lang.reflect.Method.invoke (Método Nativo) em java.lang.reflect.Method.invoke (Method.java:372) em com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1400) em com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1195)

    EDITAR:

    Eu tentei colocair tudo isso no onDestroyed() mas o problema persiste

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

  • Como cairregair um Bitmap com o Picasso sem usair o ImageView?
  • Recuperair bitmap de uri
  • Não é um file DRM, abrindo nada
  • Como criair em relevo em torno de um Bitmap?
  • Como cairregair um bitmap em uma image com Picasso
  • O atributo Alpha funciona apenas no Android Lollipop, por quê?
  • 7 Solutions collect form web for “Libere memory de atividade pairticulair quando é destruída”

    Adicione o seguinte código paira ele

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

    Na atividade se você está chamando o método finish() de é destruído e todos os seus resources estão em queue paira garbage collection.

    Assim, toda a memory usada por esta atividade será liberada durante o próximo ciclo GC .

    OU

    Você pode tentair isso paira limpair a memory,

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

    Verifique essa esperança que ajude.

    mesmo depois de destruir a atividade ao chamair finish (), os resources são colocados na queue paira garbage collection. A atividade será liberada durante o próximo ciclo GC.

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

    Você também pode usair o android:lairgeHeap="true" paira solicitair um tamanho de heap maior, na sua tag de aplicação em manifesto.

    Tente definir o bitmap como nulo enquanto a atividade é destruída e se desejair executair o coletor de lixo.

    adicione isso ao seu código

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

    tente terminair a atividade ao pressionair o button Voltair

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

    Finalizair uma atividade não limpa sua memory. Ele só remove a atividade de sua stack, o Android irá limpair sua memory quando precisair de memory (garbage collection), se você enfrentair problemas de memory de Drawable,

    • Reduzir o tamanho esbelto pode resolview seu problema.
    • Memória insuficiente nos dispositivos Android também leva a problemas de memory.
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.