2014-10-30 10 views
7

Studiowanie trochę (wiadomo, że są dobre) kod widzę logiki w następujący sposób:getLayoutInflater vs LayoutInflater.from

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

Zastanawiam się dlaczego ten if/else, jak to jest lepiej, po prostu, za pomocą LayoutInflater.from w wszystkie przypadki?

+1

Istnieją różne sposoby uzyskiwania LayoutInflater, ale wszystkie są takie same. LayoutInflater inflater1 = context.getLayoutInflater(); LayoutInflater inflater2 = context.getWindow(). GetLayoutInflater(); LayoutInflater inflater3 = LayoutInflater.from (context); LayoutInflater inflater4 = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); – HendraWD

Odpowiedz

11

To naprawdę nie ma większego znaczenia.

Aktywność delegates getLayouInflater() to Window. Typową implementacją strategii jest z kolei WindowPhoneWindow gdzie gdzie to jest aktywność.

Tak więc obiekt nadmuchiwania jest naprawdę taki sam, używając tego samego Context w przypadku aktywności.

LayoutInflater.from() to naprawdę wrapper for Context.getSystemService(). Teraz usługi systemowe to looked up by name from a map, a następnie retrieved from a cache. To wyszukiwanie ma trochę narzutów w porównaniu do uzyskiwania dostępu do już zainicjowanej zmiennej składowej w Activity.

To pachnie jak mikrooptyka, która prawdopodobnie nie wpłynie na wydajność podczas runtime w porównaniu do rzeczywistej inflacji hierarchii widoku.

Ta optymalizacja może w rzeczywistości mieć wpływ na wydajność programistów, ponieważ ludzie muszą przestać i zastanawiać się, dlaczego kod jest dostępny.

1

Tym samym kodem szewuje, że LayoutInflater.from jest używany w kontekstach, które nie są działaniem. Mogłabym założyć, że użycie nadmiaru aktywności powoduje ponowne użycie wcześniej stworzonego nadmuchiwania w porównaniu z innym wyborem, który tworzyłby układ z płaszczyzny.

Jedyna zmiana to robię jest oszczędność kontekst w zmiennej, aby zapobiec wywołanie tej samej funkcji i pobieranie tej samej wartości z obiektu wielokrotnie:

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

Android ma wiele optymalizacji w celu ponownego wykorzystania elementy, jeśli są dostępne, takie jak widoki listView, które można ponownie wykorzystać.