Moje android webviews
są powolne. Dotyczy to wszystkiego, od telefonów po 3.0+
tablety z więcej niż odpowiednimi specyfikacjami
Wiem, że wyświetlenia w sieci powinny być „ograniczone”, ale widzę aplikacje internetowe wykonane z przerwą między telefonami, które muszą wykorzystywać różne rodzaje CSS3
i JQuery
magię, działają dobrze i szybko
więc czegoś mi brakuje, czy jest coś, myWebview.SPEEDHACK(1)
czego mogę użyć do przyspieszenia?
Ponadto czasami zawartość mojego widoku po prostu się nie ładuje, zamiast powoli się ładować, po prostu się nie ładuje. Zasób, z którym testuję, jest przechowywany lokalnie, bez błędów.
Odpowiedzi:
Zależy to od ładowanej aplikacji internetowej. Wypróbuj niektóre z poniższych podejść:
Ustaw wyższy priorytet renderowania (wycofany z API 18+):
Włącz / wyłącz akcelerację sprzętową:
Wyłącz pamięć podręczną (jeśli masz problemy z zawartością):
źródło
Dodanie tego
android:hardwareAccelerated="true"
do manifestu było jedyną rzeczą, która znacznie poprawiła dla mnie wydajnośćWięcej informacji tutaj: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel
źródło
android:hardwareAccelerated="true"
animacje CSS 3D miały duże opóźnienia przed rozpoczęciem, przewijanie DIV w innych przewijalnych DIV nie działało, a aplikacja była bardziej niestabilna.Dla nas rozwiązanie było odwrotne. Wyłączyliśmy akcelerację sprzętową tylko w WebView (a nie w całej aplikacji w manifeście) za pomocą tego kodu:
Animacje CSS3 są teraz płynniejsze. Używamy Androida 4.0.
Więcej informacji tutaj: https://code.google.com/p/android/issues/detail?id=17352
źródło
WebView not displayed because it is too large to fit into a software layer (or drawing cache), needs 11534400 bytes, only 8294400 available
Myślę, że najlepiej działa:
Android 19 ma silnik Chromium dla WebView. Myślę, że działa lepiej z akceleracją sprzętową.
źródło
Miałem ten sam problem i musiałem to rozwiązać. Wypróbowałem te rozwiązania, ale ostatecznie wydajność, przynajmniej przy przewijaniu, wcale się nie poprawiła. A więc tutaj obejście, które wykonałem, i wyjaśnienie, dlaczego zadziałało.
Jeśli miałeś okazję zbadać zdarzenia przeciągania, tylko trochę, tworząc klasę "MiWebView", nadpisując metodę "onTouchEvent" i przynajmniej wypisując czas, w którym występuje każde zdarzenie przeciągania, zobaczysz, że są one oddzielone w czasie do (do) 9 ms dalej. To bardzo krótki czas pomiędzy wydarzeniami.
Spójrz na kod źródłowy WebView i po prostu zobacz funkcję onTouchEvent. Po prostu niemożliwe jest, aby procesor mógł to obsłużyć w czasie krótszym niż 9 ms (Śnij dalej !!!). Dlatego ciągle widzisz komunikat „Przegap się, ponieważ czekamy na odpowiedź WebCore na lądowanie”. wiadomość. Kod po prostu nie może być obsłużony na czas.
Jak to naprawić? Po pierwsze, nie możesz ponownie napisać kodu onTouchEvent, aby go ulepszyć, to po prostu za dużo. Możesz jednak „kpić z tego”, aby ograniczyć częstotliwość zdarzeń w przypadku ruchów przeciągania, powiedzmy do 40 ms lub 50 ms. (zależy to od procesora).
Wszystkie zdarzenia dotykowe wyglądają tak: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Musimy więc zachować ruchy W DÓŁ i W GÓRĘ oraz filtrować tempo RUCHU (to są źli ludzie).
A oto sposób na zrobienie tego (możesz dodać więcej typów zdarzeń, takich jak dotknięcie dwoma palcami, wszystko, co mnie interesuje, to przewijanie jednym palcem).
Oczywiście użyj tej klasy zamiast WebView, a zobaczysz różnicę podczas przewijania.
To tylko podejście do rozwiązania, ale wciąż nie w pełni zaimplementowane we wszystkich przypadkach opóźnienia z powodu dotykania ekranu podczas korzystania z WebView. Jest to jednak najlepsze rozwiązanie, jakie znalazłem, przynajmniej dla moich konkretnych potrzeb.
źródło
Wypróbowałem wszystkie propozycje rozwiązania problemu z wydajnością renderowania w mojej aplikacji phonegap. Ale tak naprawdę nic nie działało.
Wreszcie, po całym dniu poszukiwań, udało mi się. Ustawiłem w tagu (nie w tagu) mojego pliku AndroidManifest
Teraz aplikacja zachowuje się tak samo szybko, jak moja przeglądarka internetowa. Wygląda na to, że akceleracja sprzętowa nie zawsze jest najlepszą funkcją ...
Szczegółowy problem, który miałem: https://stackoverflow.com/a/24467920/3595386
źródło
Żadna z tych odpowiedzi nie była dla mnie pomocna.
Wreszcie znalazłem powód i rozwiązanie. Powodem było wiele filtrów CSS3 (filter, -webkit-filter).
Rozwiązanie
Dodałem wykrywanie WebView w skrypcie strony internetowej w celu dodania klasy „niskiej jakości” do treści HTML. BTW. Możesz łatwo śledzić WebView, ustawiając klienta użytkownika w ustawieniach WebView. Następnie stworzyłem nową regułę CSS
źródło
Jeśli tylko kilka elementów Twojego widoku internetowego jest powolne lub opóźnione, spróbuj dodać to do elementów css:
To był jedyny speedhack, który naprawdę wpłynął na mój widok. Ale uważaj, aby go nie nadużywać! (możesz przeczytać więcej o włamaniu w tym artykule ).
źródło
will-change: transform
.Spróbuj tego:
źródło
Jeśli wiążesz się z
onclick
wydarzeniem, może ono być powolne na ekranach dotykowych.Aby przyspieszyć, używam fastclick , który wykorzystuje znacznie szybsze zdarzenia dotykowe, aby naśladować zdarzenie kliknięcia.
źródło
$('#').on('touchstart', function() {...});
w przeciwieństwie do onclick