it-swarm.it

Android visualizzazione web lenta

Il mio Android webviews è lento. Questo è su tutto, dai telefoni ai tablet 3.0+ con specifiche più che adeguate

So che le visualizzazioni Web dovrebbero essere "limitate", ma vedo le app Web realizzate con gap telefonico che deve utilizzare tutti i tipi di stregoneria CSS3 e JQuery, funzionano alla perfezione e velocemente

quindi mi manca qualcosa, c'è una sorta di myWebview.SPEEDHACK(1) che posso usare per accelerare le cose?

inoltre, a volte i contenuti della mia visualizzazione Web semplicemente non vengono caricati, invece di caricarsi lentamente, non vengono caricati. L'asset con cui sto testando viene archiviato localmente, senza errori.

162
CQM

Dipende dall'applicazione Web caricata. Prova alcuni degli approcci di seguito:

Imposta priorità di rendering più alta (obsoleta da API 18 +):

webview.getSettings().setRenderPriority(RenderPriority.HIGH);

Abilita/disabilita l'accelerazione hardware:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
    // chromium, enable hardware acceleration
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
    // older Android version, disable hardware acceleration
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Disabilita la cache (se hai problemi con i tuoi contenuti):

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
125
peceps

L'aggiunta di questo Android:hardwareAccelerated="true" nel manifest è stata l'unica cosa che ha migliorato significativamente le prestazioni per me

Maggiori informazioni qui: http://developer.Android.com/guide/topics/manifest/application-element.html#hwaccel

48
Sender

La soluzione per noi era l'opposto. Abbiamo disabilitato l'accelerazione hardware solo su WebView (anziché sull'intera app nel manifest) utilizzando questo codice:

if (Build.VERSION.SDK_INT >= 11){
    webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Le animazioni CSS3 ora sono più fluide. Stiamo usando Android 4.0.

Maggiori informazioni qui: https://code.google.com/p/Android/issues/detail?id=17352

35
Ena

Penso che quanto segue funzioni meglio:

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

Android 19 ha il motore Chromium per WebView. Immagino che funzioni meglio con l'accelerazione hardware.

12
Tedi

Avevo lo stesso problema e ho dovuto risolverlo. Ho provato queste soluzioni, ma alla fine le prestazioni, almeno per lo scrolling, non sono migliorate affatto. Quindi ecco la soluzione che ho eseguito e la spiegazione del perché ha funzionato per me.

Se hai avuto la possibilità di esplorare gli eventi di trascinamento, solo un po ', creando una classe "MiWebView", sovrascrivendo il metodo "onTouchEvent" e almeno stampando il tempo in cui si verifica ogni evento di trascinamento, vedrai che sono separati in tempo per (fino a) 9ms di distanza. Questo è un tempo molto breve tra gli eventi.

Dai un'occhiata a WebView Source Code e vedi solo la funzione onTouchEvent. È impossibile che sia gestito dal processore in meno di 9ms (Continua a sognare !!!). Ecco perché vedi costantemente "Miss un trascinamento mentre stiamo aspettando la risposta di WebCore per il touchdown". Messaggio. Il codice non può essere gestito in tempo.

Come sistemarlo? Innanzitutto, non è possibile riscrivere il codice onTouchEvent per migliorarlo, è semplicemente troppo. Ma puoi "deriderlo" per limitare la frequenza degli eventi per trascinare i movimenti, diciamo a 40ms o 50ms. (questo dipende dal processore).

Tutti gli eventi touch vanno così: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Quindi dobbiamo mantenere i movimenti DOWN e UP e filtrare il MOVE rate (questi sono i cattivi).

Ed ecco un modo per farlo (puoi aggiungere altri tipi di eventi come il tocco di 2 dita, tutto ciò che mi interessa qui è lo scorrimento con un solo dito).

import Android.content.Context;
import Android.view.MotionEvent;
import Android.webkit.WebView;


public class MyWebView extends WebView{

    public MyWebView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    private long lastMoveEventTime = -1;
    private int eventTimeInterval = 40;

    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        long eventTime = ev.getEventTime();
        int action = ev.getAction();

        switch (action){
            case MotionEvent.ACTION_MOVE: {
                if ((eventTime - lastMoveEventTime) > eventTimeInterval){
                    lastMoveEventTime = eventTime;
                    return super.onTouchEvent(ev);
                }
                break;
            }
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP: {
                return super.onTouchEvent(ev);
            }
        }
        return true;
    }
}

Naturalmente usa questa classe invece di WebView e vedrai la differenza durante lo scorrimento.

Questo è solo un approccio a una soluzione, ma ancora non completamente implementato per tutti i casi di ritardo a causa del tocco dello schermo quando si utilizza WebView. Tuttavia è la migliore soluzione che ho trovato, almeno per le mie esigenze specifiche.

9
Nate Castro

Ho provato tutte le proposte per risolvere il problema delle prestazioni di rendering nella mia app phonegap. Ma nulla ha funzionato davvero.

Alla fine, dopo un'intera giornata di ricerche, ce l'ho fatta. Ho impostato il tag (non il tag) del mio AndroidManifest

<application Android:hardwareAccelerated="false" ...

Ora l'app si comporta nello stesso modo veloce del mio browser web. Sembra che, se l'accelerazione hardware non è sempre la migliore funzionalità ...

Il problema dettagliato che ho avuto: https://stackoverflow.com/a/24467920/3595386

8
user3595386

Nessuna di queste risposte non mi è stata utile.

Finalmente ho trovato ragione e soluzione. Il motivo erano molti filtri CSS3 (filtro, filtro -webkit).

Soluzione

Ho aggiunto il rilevamento di WebView nello script della pagina Web per aggiungere la classe "bassa qualità" al corpo HTML. BTW. È possibile monitorare facilmente WebView impostando user-agent nelle impostazioni di WebView. Quindi ho creato una nuova regola CSS

body.lowquality * { filter: none !important; }
4
l00k

Se ci sono solo alcuni componenti della tua visualizzazione web che sono lenti o lenti, prova ad aggiungere questo agli elementi css:

transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);

Questo è stato l'unico speedhack che ha davvero avuto un effetto sulla mia webview. Ma fai attenzione a non abusarne! (puoi leggere di più sull'hacking in questo articolo .)

4
Erex

Prova questo:

mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
3

Se si esegue il binding all'evento onclick, potrebbe essere lento sui touchscreen.

Per renderlo più veloce, uso fastclick , che utilizza gli eventi touch molto più veloci per imitare l'evento click.

2
Tzach