Napisałem kilka plików układu, w których użyłem layout_weight
atrybutu, aby utworzyć stosunek między różnymi widokami.
W pewnym momencie zaczynam otrzymywać ostrzeżenia o zagnieżdżonych wagach.
Zastanawiam się więc, dlaczego zagnieżdżone wagi są niekorzystne dla wydajności i czy istnieje bardziej efektywny sposób tworzenia stałego stosunku między wymiarami widoku, który można by wykorzystać dla różnych rozmiarów ekranu i który nie musi określać wielu wartości wymiarów dpi przez kilka plików układu (mam na myśli różne rozmiary ekranu).
Dziękuję Ci!
android
android-layout
performance
MobileCushion
źródło
źródło
Odpowiedzi:
Zagnieżdżone wagi są niekorzystne dla wydajności, ponieważ:
Lepiej jest używać RelativeLayout i dostosowywać widok do miejsc innych widoków bez używania określonych wartości dpi.
źródło
Aktualizacja: Jak wiemy, biblioteka procentowego wsparcia jest przestarzała z poziomu API 26.
ConstraintLayout
to nowy sposób na osiągnięcie tej samej płaskiej struktury XML.Zaktualizowany projekt Github
Zaktualizowane próbki:
Aktualizacja: Świetna wiadomość, biblioteka procentowa obsługi Androida rozwiązuje nasz problem z wydajnością i zagnieżdżoną, niechlujną wagą
LinearLayout
Rozważ ten prosty układ, aby zademonstrować to samo.
Uniknięto degradacji wydajności zagnieżdżonej
LinearLayout
z obciążeniami. Naprawdę niesamowite !!!.źródło
Myślę (i prawdopodobnie będę za to podpalony), ale znowu myślę, że mój telefon ma czterordzeniowy procesor, który może konkurować (jeśli nie całkowicie zniszczyć) większość domowych komputerów PC.
Myślę też, że tego rodzaju możliwości sprzętowe to przyszłość telefonów.
Więc dochodzę do wniosku, że dopóki nie dasz się ponieść zagnieżdżeniu (w MHO układ nigdy nie powinien być głębszy niż 4 poziomy, a jeśli tak, to prawdopodobnie robisz to źle), twój telefon mógłby się mniej przejmować o posiadaniu ciężarów.
Jest wiele rzeczy, które możesz zrobić, a które będą miały znacznie większy wpływ na wydajność, niż martwienie się, że procesor wykona dodatkowe obliczenia.
(proszę zauważyć, że jestem trochę zabawny, więc nie traktuję niczego zbyt poważnie z tego postu, poza tym, że są inne rzeczy, które powinieneś najpierw zoptymalizować, a martwienie się o 2-3-poziomową wagę nie pomaga Twoje zdrowie)
źródło
Głównym powodem, dla którego zagnieżdżone wagi są złe, jest to, że kiedy układ ma dzieci z wagą, należy go zmierzyć dwukrotnie (myślę, że jest to wspomniane w ostrzeżeniu o kłaczkach). Oznacza to, że układ ważony, który zawiera również układ ważony, musi być mierzony czterokrotnie, a każda dodana „warstwa” wag zwiększa miary o potęgę dwa.
W ICS (poziom API 14)
GridLayout
dodano, co pozwala na proste i „płaskie” rozwiązania dla wielu układów, które wcześniej wymagały wag. Jeśli tworzysz dla wcześniejszych wersji Androida, będziesz miał nieco trudniejszy czas na usunięcie ciężarów, ale użycieRelativeLayout
i spłaszczenie jak największej części układu w tej kabinie zwykle usuwa wiele zagnieżdżonych obciążeń.źródło
GridLayout
lubRelativeLayout
. Na przykładGridLayout
: „GridLayout nie obsługuje zasady wagi, zgodnie z definicją wagi. Ogólnie nie jest zatem możliwe skonfigurowanie GridLayout w celu rozłożenia nadmiaru przestrzeni między wieloma komponentami”.Istnieje proste rozwiązanie pozwalające uniknąć zagnieżdżonych układów LinearLayout z wagami - po prostu użyj Tablelayout z weightSum i zagnieżdżonym LinearLayout z weightSum - Tablelayout ma te same atrybuty co LinearLayout (orientacja, wagaSum, layout_weight itp.) I nie wyświetla komunikatu - „zagnieżdżone wagi mają zły wpływ na wydajność ”
Przykład:
źródło
Myślę, że jedyną alternatywą jest utworzenie funkcji, która nazywałaby się onResume i ustawiałaby wszystkie rozmiary i pozycje. W każdym razie, według wagi możesz ustawić tylko rozmiary, ale bez dopełnienia (więc układy stają się jeszcze bardziej skomplikowane), bez textSize (niemożliwe jakoś to skompensować), nie mówiąc już o takich rzeczach jak liczba linii.
źródło