2011-10-15 18 views
9

Sto creando nuovo menu delle opzioni all'interno frammento ma dopo aver letto http://developer.android.com/resources/articles/avoiding-memory-leaks.html che dice che è meglio usare al contesto di applicazione di contesto-attività, ho paura di usare getActivity(). GetMenuInflater()crea un nuovo menuInflater o getMenuInflater() dall'attività?

Così , in realtà che uno migliore

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    MenuInflater mInflater = new MenuInflater(getActivity().getApplicationContext()); 
    mInflater.inflate(R.menu.simple_menu, menu); 
} 

o l'attività di una chiamata

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    MenuInflater mInflater = getActivity().getMenuInflater(); 
    mInflater.inflate(R.menu.simple_menu, menu); 

} 

e, ciò che è la differenza tra i due di 'em? o ... entrambi sono uguali?

Grazie.

risposta

13

Sono molto simili. Guardando attraverso la fonte di MenuInflator, l'unica cosa che usa il contesto è accedere ai file di risorse. Quindi il contesto specifico non ha importanza per MenuInflator.

Per quanto riguarda le perdite di memoria, l'articolo si fa riferimento dice

La più ovvia [modo per evitare perdite di memoria] è quello di evitare la fuga del contesto al di fuori del proprio ambito

A meno che non passare il MenuInflator (o il Menu) a un'altra classe, quindi è contenuto nell'attività e non verrà divulgato.

EDIT

Inoltre Activity.getMenuInflator() è solo un metodo comodo per new MenuInflator(). In realtà questo è il metodo all'interno della Classe di attività:

public MenuInflater getMenuInflater() { 
    return new MenuInflater(this); 
} 

Di solito è meglio usare i metodi di convenienza in quanto consentono l'implementazione sottostante alla modifica nelle versioni future senza dover modificare il codice. Ad esempio se il metodo precedente viene modificato per restituire un'istanza memorizzata nella cache anziché crearne una nuova ogni volta.

+0

sì, ma la creazione di "nuovo" menuInflater suona come si mangia più memoria di "get" menuInflater ... e hai detto che non sarà trapelato se non passassi il menuInflatore ad un'altra classe, lo chiamo all'interno della classe frammento e non l'attività del frammento, quindi se chiamo getMenuInflator non sarà "chiama il menuInflatore da un'altra classe" ? –

+0

@ GAO-tsukai Ho perso la tua domanda su questo metodo. Ho aggiornato la mia risposta di conseguenza. – spatulamania

+0

grazie, ora sento che ho davvero bisogno di vedere la fonte Android ... –

1

Si dovrebbe usare MenuInflater esempio che viene passato al metodo public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) (notare il secondo argomento)
Non c'è differenza, perché normalmente si "dimentica" non appena hai finito di usarlo, ma il motivo per cui si avrebbe bisogno per crearne uno se ne hai già uno dagli argomenti?

0

Modifica da questo:

MenuInflater inflater = getMenuInflater(); 

A tal:

MenuInflater inflater = getActivity().getMenuInflater(); 
Problemi correlati