Czy układ RelativeLayout jest droższy niż układ liniowy?

114

Zawsze używałem RelativeLayout za każdym razem, gdy potrzebowałem kontenera View, ze względu na jego elastyczność, nawet gdybym chciał wyświetlić coś naprawdę prostego.

Czy mogę to zrobić, czy też powinienem spróbować użyć LinearLayout, kiedy mogę, z punktu widzenia wydajności / dobrych praktyk?

Dzięki!

nbarraille
źródło

Odpowiedzi:

149

W przemówieniu na Google I / O 2013 (Writing Custom Views for Android) Romain Guy wyjaśnił nieporozumienie, które spowodowało, że wszyscy zaczęli używać RelativeLayouts do wszystkiego. RelativeLayout zawsze musi wykonać dwa przejścia taktowe. Ogólnie jest to pomijalne, o ile hierarchia widoku jest prosta. Ale jeśli twoja hierarchia jest złożona, wykonanie dodatkowego pomiaru może być potencjalnie dość kosztowne. Również w przypadku zagnieżdżenia RelativeLayouts uzyskasz wykładniczy algorytm pomiaru.

https://www.youtube.com/watch?v=NYtB6mlu7vA&t=1m41s

https://www.youtube.com/watch?v=NYtB6mlu7vA&t=38m04s

Pierre-Antoine LaFayette
źródło
8
Wiem, że to stary post, ale jakie rozwiązanie uważasz za najmniej kosztowne przy wyborze między pojedynczym układem relatywnym a 2-3 układami liniowymi?
Langkiller,
5
A ConstraintLayout :)
moyheen
52

O ile nie układasz wielu widoków (np. W ListView), wydajność wyboru między LinearLayout lub RelativeLayout jest pomijalna. Wybierz to, co jest najwygodniejsze w użyciu, i martw się o wydajność tylko wtedy, gdy jest to konieczne.

A oto, co oficjalna dokumentacja na temat tworzenia wydajnych układów mówi o wydajności RelativeLayout i LinearLayout:

Trzymanie się podstawowych funkcji nie jest niestety najbardziej wydajnym sposobem tworzenia interfejsów użytkownika. Typowym przykładem jest nadużywanie LinearLayout, które prowadzi do proliferacji poglądów w hierarchii widoków. Każdy widok - lub, co gorsza, każdy menedżer układu - dodawany do aplikacji wiąże się z pewnym kosztem: inicjalizacja, układ i rysowanie stają się wolniejsze. Przebieg układu może być szczególnie kosztowny w przypadku zagnieżdżenia kilku LinearLayout, które używają parametru weight, co wymaga dwukrotnego pomiaru elementu podrzędnego.

Lie Ryan
źródło
3
uzasadnienie nieistotności? Znalazłem to, co stwierdza, że ​​relatywny układ
max4ever
Po prostu unikaj dodawania pojemników wewnętrznych.
Luis Pena,
2

Układ relatywny jest bardziej efektywny niż układ liniowy.

Od tutaj :

Powszechnym błędem jest przekonanie, że stosowanie podstawowych struktur układu prowadzi do najbardziej wydajnych układów. Jednak każdy widget i układ dodawany do aplikacji wymaga inicjalizacji, układu i rysowania. Na przykład użycie zagnieżdżonych wystąpień LinearLayout może prowadzić do zbyt głębokiej hierarchii widoku. Ponadto zagnieżdżanie kilku wystąpień LinearLayout, które używają parametru layout_weight, może być szczególnie kosztowne, ponieważ każde dziecko musi zostać zmierzone dwukrotnie. Jest to szczególnie ważne, gdy układ jest wielokrotnie zawyżany, na przykład gdy jest używany w ListView lub GridView.

Nicholas Liu
źródło
2
@phreakhead Masz rację, że nie ma jednego „prawidłowego” rozwiązania. Dlatego „poprawnym” rozwiązaniem jest prawie zawsze całkowite zapomnienie o wydajności i robienie tego, co najłatwiej jest napisać i przeczytać.
Kevin Krumwiede
3
ten cytat nie potwierdza twojego oświadczenia, co jest prawdziwe tylko w jednej sytuacji
Flo We
Prawda jest taka, że ​​projektuj układ zawsze starając się zminimalizować liczbę poziomów hierarchii (układ wewnątrz układu wewnątrz układu) i sprawdź narzędzie przeglądarki hierarchii, aby znaleźć potencjalne problemy.
Alexander Haroldo da Rocha
1

AKTUALIZACJA 2018: W wersji N systemu Android ConstraintLayoutklasa zapewnia podobną funkcjonalność RelativeLayout, ale znacznie niższy koszt. Jest to bardzo potężny menedżer układu i powinien być używany, gdy konieczne jest zbudowanie złożonego GUI.

akelec
źródło
od ostatniej wersji stało się bardzo, bardzo powolne
Dragos Rachieru
To zależy od tego, jak jest używany. Należy unikać pozycjonowania bezwzględnego i używać ograniczeń.
akelec
-25

Możesz spróbować

<LinearLayout>
       <ViewPager/><!--Loading images from net, it is very good as a testing case.-->
       <ViewPagerIndicator/>
       <TextView/> <!--Show some info about page-->
</LinearLayout>

<RelativeLayout>           
       <ViewPager/><!--Loading images from net, it is very good as a testing case.-->
       <ViewPagerIndicator below="id of ViewPager"/>
       <TextView below="id of ViewPagerIndicator"/> <!--Show some info about page-->
</RelativeLayout>

Przekonasz się, że jest wiele różnych, jeśli Twoje strony ładują niektóre obrazy z Internetu. W tym przypadku LinearLayout jest o 100% lepszy niż RelativeLayout kiedykolwiek.

TeeTracker
źródło