2014-10-30 7 views
7

Studiare po 'di codice (noto per essere buono) Riesco a vedere la logica come segue:getLayoutInflater vs LayoutInflater.from

if (getContext() instanceof Activity) { 
     inflater=((Activity)getContext()).getLayoutInflater(); 
} 
    else { 
     inflater=LayoutInflater.from(getContext()); 
} 

mi domando, perché questo if/else, come è meglio, semplicemente, utilizzando LayoutInflater.from in tutti i casi?

+1

Ci sono delle variazioni su come ottenere LayoutInflater, ma sono tutte uguali. LayoutInflater inflater1 = context.getLayoutInflater(); LayoutInflater inflater2 = context.getWindow(). GetLayoutInflater(); LayoutInflater inflater3 = LayoutInflater.from (context); LayoutInflater inflater4 = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); – HendraWD

risposta

11

Non importa molto.

Attività delegates getLayouInflater() to Window. La solita implementazione della politica di WindowPhoneWindow a turno initializes its inflater with LayoutInflater.from(context) dove context è l'attività.

Quindi l'oggetto inflater è davvero lo stesso, utilizzando lo stesso Context in caso di un'attività.

LayoutInflater.from() è davvero un wrapper for Context.getSystemService(). Ora i servizi di sistema sono looked up by name from a map e quindi retrieved from a cache. Questa ricerca ha un sovraccarico rispetto all'accesso a una variabile membro già inizializzata in Activity.

Così ha l'odore di una micro ottimizzazione che probabilmente non influisce molto sulle prestazioni di runtime rispetto all'inflazione della gerarchia delle viste effettive.

Questa ottimizzazione può effettivamente avere l'effetto negativo sulla produttività degli sviluppatori in quanto le persone hanno bisogno di fermarsi e spendere un po 'di riflessione sul perché il codice è presente.

1

Con lo stesso codice si esegue il comando che LayoutInflater.from viene utilizzato nei contesti che non sono un'attività. Suppongo che l'uso del inflater di Activity riutilizza un inflater già creato rispetto all'altra scelta che creerebbe un layout in un contesto.

L'unico cambiamento che vorrei fare è salvare il contesto in una variabile per evitare di chiamare la stessa funzione e recuperando lo stesso valore dall'oggetto più volte:

Context ctx = getContext(); 
if(ctx instanceof Activity) { 
    inflater = ((Activity)ctx).getLayoutInflater(); 
} 
else { 
    inflater = LayoutInflater.from(ctx); 
} 

Android ha un sacco di ottimizzazioni in atto per riutilizzare elementi quando disponibili, come le viste di ListViews che possono essere riutilizzate.

Problemi correlati