2010-11-02 18 views
16

W mojej aplikacji ładuję listę zewnętrznych URL-i w widoku internetowym i pozwalam użytkownikowi przeglądać je. Wyświetlenia stron internetowych są ładowane do flippera. Uważam, że wydajność jest naprawdę zła w adresie URL podglądu strony internetowej. Próbowałem wszystkiego, od korzystania z układu ramek do ograniczania liczby wyświetleń stron internetowych do załadowania. Mimo to wydajność nie jest zadowalająca.Wydajność Android WebView

Jak zoptymalizować wydajność widoku internetowego? To powinno być powszechne użycie. Czy brakuje mi czegoś oczywistego?

Moi Webview ustawienia -

webView.setInitialScale(WEBVIEW_SCALE); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.getSettings().setBuiltInZoomControls(false); 
    webView.setWebViewClient(new MyWebViewClient());  
    webView.setOnTouchListener(new OnTouchListener()); 
+0

Czy jesteś pewien, że to nie jest ładowanie danych z internetu problem? – Falmarri

+0

Nie. Dane są ładowane. Ale to zajmuje dużo czasu. – Usha

+1

Ładowanie wielu stron na raz jest kosztowne - nawet załadowanie pojedynczej strony internetowej jest kosztowną operacją. Odkładając na bok całe przetwarzanie danych, takich jak obrazy, skalowanie portu widokowego itp. Istnieją również ograniczenia dotyczące wydajności wielu jednoczesnych połączeń z gniazdami. Na koniec przypuszczam, że jeśli obejrzysz dziennik, zobaczysz dużo thrash'u GC. Nie jest wskazane, aby wiele WebView było aktywnych jednocześnie. Bez ilościowego opisu "wydajność nie jest satysfakcjonująca" lub z używanego telefonu, mogę tylko zgadywać, że niewiele można zrobić, aby go poprawić. – cistearns

Odpowiedz

1

ta została już omówiona tutaj: Enhance webView performance (should be the same performance as native Web Browser)

wpadłem na podobny problem, a po kilku ciężkich debugowanie zauważył przeglądarkę natywnej przeglądarki i Webview wydaje się używać różnych pamięci podręcznych.

Ten kod może być użyty do wyłączenia pamięci podręcznej WebView i uczynił WebView dla mnie szybszym (choć kosztem braku buforowania). Zauważ, że używa prywatnych API, więc stosując go masz ryzykując kod będzie przerwa w przyszłych wydaniach:

try 
{ 
    Method m = CacheManager.class.getDeclaredMethod("setCacheDisabled", boolean.class); 
    m.setAccessible(true); 
    m.invoke(null, true); 
} 
catch (Throwable e) 
{ 
    Log.i("myapp","Reflection failed", e); 
} 
+0

Czy to wyłącza buforowanie dla każdego WebView używanego przez aplikację? Czy byłby jakiś sposób wyłączenia buforowania dla tylko jednego WebView? Dzięki! –

+0

Wygląda na to, że moje pytanie może zostać odebrane przez metodę WebSettings '.setCacheMode (WebSettings.LOAD_NO_CACHE);' –

+0

Chociaż według tego pytania, to albo nie działa, albo tylko pomija kontrolę pamięci podręcznej, ale nadal zapisuje do pamięci podręcznej. http: // stackoverflow.com/questions/5239954/webviews-load-no-cache-setting-still-saves-files-to-the-disk –

4

Spróbuj to:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
} else { 
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
} 
2

Myślę, że poniższe działa najlepiej :

if (Build.VERSION.SDK_INT >= 19) { 
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
}  
else { 
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
} 

Android 19 ma silnik Chromium dla WebView. Wydaje mi się, że działa lepiej z akceleracją sprzętową.

Aby uzyskać więcej informacji Android 4.4 KitKat, the browser and the Chrome WebView