Jestem nowy w środowisku Android SDK / API. To pierwszy próbuję narysować wykres / wykres. Próbowałem uruchomić różne rodzaje przykładowych kodów emulatora przy użyciu 3 różnych bezpłatnych bibliotek, nic nie wyświetla się na ekranie układu. Logcat powtarza następujący komunikat:
W / Trace (1378): Nieoczekiwana wartość z nativeGetEnabledTags: 0 I / Choreographer (1378): Pominięto 55 klatek! Aplikacja może wykonywać zbyt wiele pracy w głównym wątku.
Problem nie utrzymywał się, a wykres działał, gdy uruchomiłem przykładowy kod dotyczący kopii testowej licencjonowanej biblioteki.
android
multithreading
użytkownik2038135
źródło
źródło
Odpowiedzi:
zaczerpnięte z: Android UI: Naprawianie pomijanych ramek
Oznacza to, że twój kod długo się przetwarza, a ramki są z tego powodu pomijane. Być może z powodu jakiegoś ciężkiego przetwarzania, które wykonujesz w sercu aplikacji lub dostępu do bazy danych, lub jakiejkolwiek innej rzeczy, która powoduje, że wątek zatrzymaj się na chwilę.
źródło
Jak inni odpowiedzieli powyżej, „Pominęło 55 klatek!” oznacza, że w twojej aplikacji jest trochę intensywnego przetwarzania.
W moim przypadku moja aplikacja nie wymaga intensywnego procesu. Podwójnie i potrójnie sprawdziłem wszystko i usunąłem proces, który moim zdaniem był trochę ciężki.
Usunąłem Fragmenty, Aktywności, Biblioteki, dopóki nie został tylko szkielet. Ale problem nie zniknął. Postanowiłem sprawdzić zasoby i znalazłem kilka ikon i tła, z których korzystam, są dość duże, ponieważ zapomniałem sprawdzić rozmiar tych zasobów.
Sugeruję więc, że jeśli żadna z powyższych odpowiedzi nie pomoże, możesz również sprawdzić rozmiar plików zasobów.
źródło
Ja też miałem ten sam problem.
Mój był przypadek, w którym używałem obrazu tła, który był w drawable. Ten konkretny obraz miał około 130kB i był używany podczas ekranu powitalnego i strony głównej w mojej aplikacji na Androida.
Rozwiązanie - właśnie przeniosłem ten konkretny obraz do folderu drawables-xxx z drawable i mogłem zwolnić dużo pamięci zajmowanej w tle, a ramki pomijania nie były już pomijane.
Aktualizacja Użyj folderu zasobów do rysowania „nodp” do przechowywania plików rysowanych w tle.
Czy pierwszeństwo ma folder z możliwością rysowania lub nodpi z możliwością rysowania?
źródło
drawable-xxxhdpi
Zamiastdrawable
tego używam folderu, co radykalnie zmniejsza zużycie pamięci (~ 70 procent mniej). Warto również wiedzieć, że ekrany o tym samym rozmiarze różnią się rozmiarem DPI. Stosunek w pikselach między nimi jestldpi = 1:0.75
,mdpi = 1:1
,hdpi = 1:1.5
,xhdpi = 1:2
,xxhdpi = 1:3
,xxxhdpi = 1:4
. Korzystając zdrawable-xxxhdpi
folderu, możesz zmniejszyć skalę obrazów do rozmiaru ekranu urządzenia, co zmniejsza zużycie pamięci i procesora.drawable
dodrawable-nodpi
uniemożliwia uzyskanie aplikacjiOut of Memory Error
.Inną częstą przyczyną opóźnień w wątku interfejsu użytkownika jest dostęp do SharedPreferences. Po pierwszym wywołaniu
PreferenceManager.getSharedPreferences
i podobnych metod skojarzony plik .xml jest natychmiast ładowany i analizowany w tym samym wątku .Jednym z dobrych sposobów rozwiązania tego problemu jest uruchomienie pierwszego obciążenia SharedPreference z wątku w tle, uruchomionego jak najwcześniej (np. Z
onCreate
klasy Application). W ten sposób obiekt preferencji może być już skonstruowany do czasu, kiedy chcesz go użyć.Niestety, czasami czytanie plików preferencji jest konieczne na wczesnych etapach uruchamiania (np. W początkowej czynności lub nawet samej aplikacji). W takich przypadkach nadal można uniknąć zablokowania interfejsu użytkownika przy użyciu
MessageQueue.IdleHandler
. Zrób wszystko, co musisz wykonać w głównym wątku, a następnie zainstaluj IdleHandler, aby wykonać kod po pełnym narysowaniu działania. W tym Runnable powinieneś mieć dostęp do SharedPreferences bez opóźniania zbyt wielu operacji rysowania i powodowania niezadowolenia choreografa.źródło
Spróbuj zastosować następujące strategie, aby poprawić wydajność aplikacji:
źródło
Miałem ten sam problem. Emulator Androida działał doskonale na Androidzie <6.0. Kiedy korzystałem z emulatora Nexusa 5 (Android 6.0), aplikacja działała bardzo wolno
I/Choreographer: Skipped frames
w logach.Rozwiązałem ten problem, zmieniając
hardwareAccelerated
opcję pliku manifestutrue
tak, aby :źródło
Nie jestem ekspertem, ale dostałem ten komunikat debugowania, gdy chciałem wysłać dane z mojej aplikacji na Androida na serwer WWW. Chociaż użyłem klasy AsyncTask i przeszedłem dane w tle, do odzyskania danych wynikowych z serwera użyłem metody get () klasy AsyncTask, która sprawia, że interfejs użytkownika jest synchroniczny, co oznacza, że interfejs użytkownika będzie czekał zbyt długo. Dlatego radzę, aby Twoja aplikacja wykonywała wszystkie zadania sieciowe w osobnym wątku.
źródło
Zoptymalizuj swoje zdjęcia ... Nie używaj obrazów większych niż 100 KB ... Ładowanie zdjęć zajmuje zbyt dużo procesora i powoduje zawieszanie się aplikacji.
źródło
Miałem ten sam problem. W moim przypadku miałem 2 zagnieżdżone układy względne. RelativeLayout zawsze musi wykonać dwa pomiary. Po zagnieżdżeniu RelativeLayouts otrzymujemy wykładniczy algorytm pomiaru.
źródło
zwykle dzieje się tak, gdy wykonujesz ogromne procesy w głównym wątku. możesz pominąć ramki mniejsze niż 200. ale jeśli masz więcej niż 200 pominiętych ramek, może to spowolnić Twój wątek interfejsu aplikacji. co możesz zrobić, to wykonać te procesy w nowym wątku zwanym wątkiem roboczym, a następnie, gdy chcesz uzyskać dostęp i zrobić coś z wątkiem interfejsu użytkownika (np. zrobić coś z widokami, findView itp.), możesz użyć modułu obsługi lub runOnUiThread (Podoba mi się to bardziej), aby wyświetlić wyniki przetwarzania. to absolutnie rozwiązuje problem. używanie wątków roboczych jest bardzo przydatne, a nawet należy je stosować w takich przypadkach.
źródło
Miałem ten sam problem. Kiedy uruchomiłem kod na innym komputerze, zadziałało dobrze. Jednak mój wyświetlał komunikat „Aplikacja może wykonywać zbyt wiele pracy w głównym wątku”.
Rozwiązałem problem, uruchamiając ponownie studio Android [Plik -> Unieważnione pamięci podręczne / Uruchom ponownie -> kliknij „Unieważnij i uruchom ponownie”].
źródło
W moim przypadku było tak, ponieważ przypadkowo ustawiłem punkt przerwania dla metody. Gdy go usunąłem, komunikat zniknął, a wydajność znacznie się poprawiła.
źródło
Moja aplikacja miała ten sam problem. Ale nie robił nic poza wyświetlaniem na nim listy kart i tekstu. Nic nie działa w tle. Ale potem, po pewnym dochodzeniu, ustalono, że przyczyną tego był zestaw obrazów tła karty, mimo że był mały (350 kb). Następnie przekonwertowałem obraz na 9-częściowe obrazy za pomocą http://romannurik.github.io/AndroidAssetStudio/index.html .
To zadziałało dla mnie.
źródło
Po przeprowadzeniu wielu prac badawczo-rozwojowych w tej kwestii otrzymałem Rozwiązanie,
W moim przypadku korzystam z usługi, która będzie uruchamiana co 2 sekundy, a wraz z runonUIThread zastanawiałem się, czy problem istnieje, ale wcale. Kolejnym problemem, który znalazłem, jest to, że używam dużego obrazu w aplikacji May i to jest problem.
Usunąłem Obrazy i ustawiłem nowe Obrazy.
Wniosek: - Sprawdź, czy w kodzie jest dowolny plik raw, którego używasz, ma duży rozmiar.
źródło
Najpierw przeczytaj ostrzeżenie. Mówi więcej obciążenia głównego wątku. Musisz więc po prostu uruchamiać funkcje z większą ilością pracy w wątku.
źródło
Mam ten sam problem podczas tworzenia aplikacji, która używa wielu rysowalnych plików png w układzie siatki. Próbowałem również zoptymalizować mój kod tak dalece, jak to możliwe .. ale to nie zadziałało dla mnie .. Potem próbowałem zmniejszyć rozmiar tych png .. i zgaduję, że działa absolutnie dobrze .. Więc moja sugestia to zmniejszyć wielkość zasobów do wyciągnięcia, jeśli występują ..
źródło