Autore Topic: Chiudere correttamente un'activity  (Letto 828 volte)

Offline breakdom

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsun Galaxy S2
Chiudere correttamente un'activity
« il: 29 Dicembre 2013, 09:02:02 CET »
0
Buongiorno a tutti,
qualcuno potrebbe indicarmi il modo corretto di chiudere tutto quello che è associato ad un'activity quando ne richiamo un'altra?

Vi posto l'attuale codice che io uso sia per chiamare l'activity sia per gestire la garbage collection sul metodo onDestroy :

1) Sul tasto che carica l'activity successiva

Intent i = new Intent(getApplicationContext(), NuovaActivity.class);
startActivity(i);
finish();

e poi su OnDestroy

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

La prima cosa che secondo me sbaglio è tenere insieme sia Runtime.getRuntime().gc(); che System.gc(); però attendo vostra conferma.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Chiudere correttamente un'activity
« Risposta #1 il: 29 Dicembre 2013, 09:41:48 CET »
0
La prima parte mi torna, ma non capisco la necessità di invocare il garbage collector.

Anzi, da quello che so, è una cosa da non fare. Per vari motivi: (1) anche se lo invochi, non è garantito che venga avviato, per cui non ci puoi fare affidamento; (2) se parte, non è detto che vada ad eliminare quello che vuoi sia eliminato, elimina qualche oggetto e poi esce; (3) se hai problemi di occupazione di memoria e/o un leakage, non è con il GC che risolvi il problema.

Insomma, per chiudere una activity basta la prima parte.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline breakdom

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsun Galaxy S2
Re:Chiudere correttamente un'activity
« Risposta #2 il: 29 Dicembre 2013, 10:44:48 CET »
0
Grazie, infatti da quando l'ho messo non ho notato miglioramenti.
Per caso potresti indicarmi qualche guida su come deallocare gli oggetti? Per esempio io uso un array e alla fine gli assegno NULL per deallocarlo ma non so se è corretto, il mio problema principale sono comunque le bitmap allocate come background e le ImageView, sono gli unici crash che ho riscontrato dalla console google da parte degli utenti che hanno scaricato la mia app ( 2 crash su 6000 è irrisorio ma comunque vorrei capire che è un problema mio ).

Ecco l'errore :

java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:503)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:356)
at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:379)
at com.tombola.CartelleGrid.decodeSampledBitmapFromResource(CartelleGrid.java:348)
at com.tombola.CartelleGrid.onCreate(CartelleGrid.java:78)
at android.app.Activity.performCreate(Activity.java:5133)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389)
at android.app.ActivityThread.access$600(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5289)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
at dalvik.system.NativeStart.main(Native Method)



Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Chiudere correttamente un'activity
« Risposta #3 il: 29 Dicembre 2013, 11:17:52 CET »
0
Secondo i vari articoli che girano, il problema non è tanto la deallocazione dei precedenti usi della memoria, ma un più corretto uso della memoria.

Alcuni articoli che spiegano come fare sono questi:
https://developer.android.com/training/displaying-bitmaps/manage-memory.html#inBitmap
Loading Large Bitmaps Efficiently | Android Developers
Casual: Android: Bitmap Memory Management
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline breakdom

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsun Galaxy S2
Re:Chiudere correttamente un'activity
« Risposta #4 il: 29 Dicembre 2013, 11:23:45 CET »
0
Grazie,
io comunque ho preso spunto da qui :

Loading Large Bitmaps Efficiently | Android Developers

quello che mi hai indicato anche tu però darò un'occhiata anche agli altri.
Il mio dubbio è che stia cercando il problema sul codice quando invece può essere il dispositivo, magari troppe app aperte... non so. A me non è mai capitato e faccio le prove su 4 dispositivi diversi sia di fascia alta che bassa, sia tablet che smartphone.