Autore Topic: liberare risorse, onDestroy ?  (Letto 1693 volte)

Offline truccoandroid

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
liberare risorse, onDestroy ?
« il: 08 Ottobre 2012, 10:07:09 CEST »
0
Salve mi è venuto qualche dubbio. Pe rendere l' app più veloce cancello tutti gli oggetti etc etc..

L' avevo fatto cosi

Codice (Java): [Seleziona]
@Override
        protected void onDestroy() {
                super.onDestroy();
               
                oggetto1= null;
                oggetto2=null;
                activityListener = null;
                System.gc();
        }

Poi mi sono ricordato che onDestroy viene chiamato solo quando ad Android servono risorse quindi gli oggetti rimangono in memoria. Ho scoperto poi che chiamando finish() è come se si forzasse il metodo.

Secondo voi dove dovrei liberare le risorse ? Se passo da un' activity ad un' altra potrei chimare finish ma cosa succede se l' utente utilizza il tato back?

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:liberare risorse, onDestroy ?
« Risposta #1 il: 08 Ottobre 2012, 10:23:11 CEST »
0
Non dovresti preoccuparti di liberare le risorse. La chiamata System.gc() tra l'altro mi pare che non garantisca che il Garbage Collector agisca immediatamente.
Inoltre la onDestroy() viene chiamata solo quando la tua activity viene eliminata, cioè alla pressione del tasto back o quando il sistema la chiude.
In ogni caso non credo che velocizzeresti niente, l'azione del GC non é affatto gratuita.
Postate il LogCat LogCat LogCat LogCat LogCat

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:liberare risorse, onDestroy ?
« Risposta #2 il: 08 Ottobre 2012, 10:29:36 CEST »
0
Secondo voi dove dovrei liberare le risorse ? Se passo da un' activity ad un' altra potrei chimare finish ma cosa succede se l' utente utilizza il tato back?

La virtual machine si preoccupa di liberare le risorse per le quali non esistono più riferimenti, per cui distruggere i riferimenti dovrebbe mettere la risorsa in lista per essere liberata dal garbage collector. Ma metterla nel metodo ondestroy penso sia abbastanza superfluo, perchè la distruzione dell'activity invalida comunque tutti i riferimenti che contiene.

Piuttosto, per rendere il sistema più ottimizzato e reattivo quello che prescrivono è creare meno oggetti possibile.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline truccoandroid

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
Re:liberare risorse, onDestroy ?
« Risposta #3 il: 08 Ottobre 2012, 10:53:28 CEST »
0
Ok per il onDestroy ma quando devo dichiarare null gli oggetti ? Quando cambio Activity?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:liberare risorse, onDestroy ?
« Risposta #4 il: 08 Ottobre 2012, 11:21:15 CEST »
0
Ok per il onDestroy ma quando devo dichiarare null gli oggetti ? Quando cambio Activity?

Mai :)
In Java si arrangia il GC a riciclare gli oggetti quando non sono più necessari.

Offline truccoandroid

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
Re:liberare risorse, onDestroy ?
« Risposta #5 il: 08 Ottobre 2012, 12:44:53 CEST »
0
Fatemi capire, non esiste un modo per gestire la memoria, o un modo per ottimizzare ? Solo la creazione di meno oggetti possibili? Mi sembra strano...
Si finalizzano gli oggetti o no?
Se a me non servono più io li dichiaro null mi pare che sia corretto cosi.


Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:liberare risorse, onDestroy ?
« Risposta #6 il: 08 Ottobre 2012, 12:48:01 CEST »
0
Se a me non servono più io li dichiaro null mi pare che sia corretto cosi.

Se ritieni sia corretto, fallo pure. Ma sappi che è inutile :)

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:liberare risorse, onDestroy ?
« Risposta #7 il: 08 Ottobre 2012, 12:50:30 CEST »
0
Qui trovi un pò di info sulla documentazione ufficiale in merito  :-)
http://developer.android.com/guide/practices/performance.html

Online undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:liberare risorse, onDestroy ?
« Risposta #8 il: 08 Ottobre 2012, 13:07:42 CEST »
0
IMHO se non scrivi cose banali secondo me dovresti nullare.
Non fosse per una questione di pulizia e per evitare crash random.

Venendo dal c/c++ se alloco qualcosa e lo uso qua e là nullo in ordine di dipendenza tutti i riferimenti.

Dove e se serve (e se puoi ) nulla e ricrea nella onpause/onresume.

Per quanto riguarda System.gc in J2ME era tassativo in android concordo: può essere evitato nel 99% dei casi.
Parlando chiaramente un bitmap.recycle dovrebbe essere sufficiente a gestire i pochi casi in cui hai bisogno di liberare molta memoria.

ps il concetto "non farlo tanto è inutile" mi spaventa un pò.  :-P

Offline kiuzhack

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Google+
    • kiuzhack
    • Mostra profilo
    • Kiuz
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Mac OSx
Re:liberare risorse, onDestroy ?
« Risposta #9 il: 08 Ottobre 2012, 13:28:19 CEST »
0
Salve mi è venuto qualche dubbio. Pe rendere l' app più veloce cancello tutti gli oggetti etc etc..

L' avevo fatto cosi

Codice (Java): [Seleziona]
@Override
        protected void onDestroy() {
                super.onDestroy();
               
                oggetto1= null;
                oggetto2=null;
                activityListener = null;
                System.gc();
        }

Poi mi sono ricordato che onDestroy viene chiamato solo quando ad Android servono risorse quindi gli oggetti rimangono in memoria. Ho scoperto poi che chiamando finish() è come se si forzasse il metodo.

Secondo voi dove dovrei liberare le risorse ? Se passo da un' activity ad un' altra potrei chimare finish ma cosa succede se l' utente utilizza il tato back?
Lasciando perdere per un secondo che liberare le risorse non serve perchè JAVA possiede un buon metodo per farlo da se, ma la cosa più importante è che il tuo "onDestroy" non fa assolutamente niente di utile perché alle seguenti riche tu stai solo associando NULL agli oggetti, e la cosa non elimina gli oggetti in questione. Ma ne cambia solo il contenuto. In secondo luogo il vecchio contenuto di oggetto1 e oggetto2 esiste ancora da qualche parte solo perchè tecnicamente oggetto1 e oggetto2 sono degli indirizzi a locazione di memoria.
Codice (Java): [Seleziona]
       
                oggetto1= null;
                oggetto2=null;
                activityListener = null;
}

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:liberare risorse, onDestroy ?
« Risposta #10 il: 08 Ottobre 2012, 13:34:11 CEST »
0
IMHO se non scrivi cose banali secondo me dovresti nullare.
Non fosse per una questione di pulizia e per evitare crash random.

Venendo dal c/c++ se alloco qualcosa e lo uso qua e là nullo in ordine di dipendenza tutti i riferimenti.

Dove e se serve (e se puoi ) nulla e ricrea nella onpause/onresume.
ps il concetto "non farlo tanto è inutile" mi spaventa un pò.  :-P

Per quanto mi riguarda "non serve" = "non porta nessun beneficio" = "inutile sporcare il codice e perderci tempo".
Potresti spiegare per quale motivo sostieni sarebbe meglio "nullare" gli oggetti?

Offline kiuzhack

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Google+
    • kiuzhack
    • Mostra profilo
    • Kiuz
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Mac OSx
Re:liberare risorse, onDestroy ?
« Risposta #11 il: 08 Ottobre 2012, 13:37:37 CEST »
0
Ma tecnicamente è sbagliato. Se si vuole liberare spazio, il "NULLARE" non lo fa.
Oggetto1 e oggetto sono Indirizzi di memoria dove sono scritti i dati. Quindi mettere null a oggetto1 e oggetto2 significa cambiare indirizzo non liberare la memoria al quale oggetto1 e oggetto2 fanno riferimento.

Online undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:liberare risorse, onDestroy ?
« Risposta #12 il: 08 Ottobre 2012, 13:43:11 CEST »
0
Mi spaventa l'idea del non serve ci pensa il sistema in ambito android solo perchè sappiamo che non tutto è sempre come dovrebbe, non tutti i device usano la stessa versione non tutti seguono le regole e così via.

Per esempio in una app non banale è possibile avere più parti che girano contemporaneamente e accedono alle stesse risorse. Tra l'altro per alcune features questo è l'unico modo per utilizzarle.

Affidarsi al fatto che il sistema in autonomia deallochi le risorse ha senso ma se lasci la ondestroy vuota o non fermi e distruggi tutto il risultato in quei casi è un crash (a volte random, a volte sistematico). A quel punto nullare o comunque prevedere un meccanismo per fermare tutto diventa una necessità più che uno sfizio. Se devo dichiararmi dei boolean in giro tanto vale nullaree gestirmi questo caso è molto più pulito e ha effetti collaterali positivi (tipo se c'è un problema nel caricamento di una risorsa riporto null e sono in grado già di gestire gli effetti di questo errore).

Che poi estendendo il discorso si può per esempio rivelare utile nel caso in cui tu in futuro voglia prevedere una funzione "restart". Classico caso in cui se uno non si gestisce le cose per bene poi ci perde ore per implementare una funzioncina all'apparenza stupida.

 ;-)

Online undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:liberare risorse, onDestroy ?
« Risposta #13 il: 08 Ottobre 2012, 13:48:13 CEST »
0
Ma tecnicamente è sbagliato. Se si vuole liberare spazio, il "NULLARE" non lo fa.
Oggetto1 e oggetto sono Indirizzi di memoria dove sono scritti i dati. Quindi mettere null a oggetto1 e oggetto2 significa cambiare indirizzo non liberare la memoria al quale oggetto1 e oggetto2 fanno riferimento.
Sul fatto che sia sbagliato non ci piove, ovviamente ti quoto.

Però il ragionamento di truccoandroid va preso nel contesto. Lui parla di System.gc e se io non elimino i riferimenti system.gc non mi serve a niente.

Da un punto di vista generale la mia opinione è:
1- system.gc servirà si e no l1% delle volte, per tutto il resto c'è bitmap.recycle altrimenti c'è il sistema operativo.
2- nullare secondo me diventa una necessità se hai una app minimamente complessa perchè devi gestire una serie di componenti che stanno accedendo alle stesse cose
3- nullare più che essere inteso come qualcosa che ti libera memoria per me è come dire: ehi questo a me non serve più, io elimino i riferimenti. secondo me è buona norma eliminare i riferimenti a ciò che non ti serve più.

 :-)

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:liberare risorse, onDestroy ?
« Risposta #14 il: 08 Ottobre 2012, 14:15:24 CEST »
0
3- nullare più che essere inteso come qualcosa che ti libera memoria per me è come dire: ehi questo a me non serve più, io elimino i riferimenti. secondo me è buona norma eliminare i riferimenti a ciò che non ti serve più.

Si infatti. NULLare non libera nessuna memoria, ma ha l'effetto collaterale di far sparire qualsiasi riferimento all'oggetto in questione, per cui al prossimo giro di garbage collection, ci sta che venga deallocato. L'opposto è il femomeno del leakage, per cui da qualche parte (esempio in un thread sopravvissuto) è rimasto un riferimento a qualcosa, che quindi non sarà mai deallocato finchè il thread non viene ucciso insieme al processo dell'app. Tutto sommato NULLare potrebbe essere una buona abitudine per oggetti molto grossi usati all'interno di thread.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store