programacion - Android webview lento
manual de programacion android pdf (10)
Mi android webviews
es lenta. Esto está en todo, desde teléfonos hasta 3.0+
tabletas con especificaciones más que adecuadas
Sé que se supone que las visitas a la web son "limitadas", pero veo que las aplicaciones web se realizan con una brecha telefónica que debe estar usando todo tipo de CSS3
y JQuery
, funcionan de forma precisa y rápida.
entonces me falta algo, ¿hay algún tipo de myWebview.SPEEDHACK(1)
que pueda usar para acelerar las cosas?
Además, a veces los contenidos de mi página web simplemente no se cargan, en lugar de cargarlos lentamente, simplemente no se cargan. El activo con el que estoy probando se almacena localmente, sin errores.
Agregar este android:hardwareAccelerated="true"
en el manifiesto fue lo único que mejoró significativamente el rendimiento para mí
Más información aquí: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel
Creo que lo siguiente funciona mejor:
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 tiene el motor Chromium para WebView. Supongo que funciona mejor con la aceleración de hardware.
Depende de la aplicación web que se esté cargando. Pruebe algunos de los enfoques a continuación:
Establece una prioridad de renderización más alta (obsoleta de la API 18+):
webview.getSettings().setRenderPriority(RenderPriority.HIGH);
Activar / desactivar la aceleración de 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);
}
Inhabilite la caché (si tiene problemas con su contenido):
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
Estaba teniendo el mismo problema y tuve que resolverlo. Probé estas soluciones, pero al final el rendimiento, al menos para el desplazamiento, no mejoró en absoluto. Entonces aquí el trabajo que hice y la explicación de por qué funcionó para mí.
Si tuviste la oportunidad de explorar los eventos de arrastre, solo un poco, creando una clase "MiWebView", sobrescribiendo el método "onTouchEvent" y al menos imprimiendo la hora en que ocurre cada evento de arrastre, verás que están separados a tiempo para (hasta) 9ms de distancia. Eso es un tiempo muy corto entre los eventos.
Eche un vistazo al Código fuente de WebView y simplemente vea la función onTouchEvent. Es imposible que el procesador lo maneje en menos de 9 ms (¡sigue soñando!). Es por eso que constantemente ves "Miss a drag" mientras esperamos la respuesta de WebCore para touchdown ". mensaje. El código simplemente no puede ser manejado a tiempo.
¿Como arreglarlo? Primero, no puede volver a escribir el código onTouchEvent para mejorarlo, es demasiado. Pero, puedes "burlarte" para limitar la tasa de eventos para arrastrar movimientos digamos a 40ms o 50ms. (esto depende del procesador).
Todos los eventos táctiles son así: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Entonces debemos mantener los movimientos de ABAJO y ARRIBA y filtrar la tasa de MOVIMIENTO (estos son los tipos malos).
Y aquí hay una manera de hacerlo (puede agregar más tipos de eventos, como tocar dos dedos, todo lo que me interesa aquí es el desplazamiento con un solo dedo).
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;
}
}
Por supuesto, use esta clase en lugar de WebView y verá la diferencia al desplazarse.
Este es solo un enfoque para una solución, pero aún no se implementa completamente para todos los casos de retraso debido al toque de la pantalla al usar WebView. Sin embargo, es la mejor solución que encontré, al menos para mis necesidades específicas.
Intenté todas las propuestas para solucionar el problema de rendimiento de representación en mi aplicación de facsímil. Pero nada realmente funcionó.
Finalmente, después de un día entero de búsqueda, lo hice. Configuré dentro de la etiqueta (no la etiqueta) de mi AndroidManifest
<application android:hardwareAccelerated="false" ...
Ahora la aplicación se comporta de la misma manera rápida que mi navegador web. Parece que, si la aceleración de hardware no siempre es la mejor característica ...
El problema detallado que tuve: https://.com/a/24467920/3595386
La solución para nosotros fue todo lo contrario. Desactivamos la aceleración de hardware en WebView solamente (en lugar de en toda la aplicación en el manifiesto) mediante el uso de este código:
if (Build.VERSION.SDK_INT >= 11){
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
Las animaciones CSS3 son más suaves ahora. Estamos usando Android 4.0.
Más información aquí: https://code.google.com/p/android/issues/detail?id=17352
Ninguna de esas respuestas no fue útil para mí.
Finalmente, he encontrado la razón y la solución. La razón fue una gran cantidad de filtros CSS3 (filtro, -webkit-filtro).
Solución
He agregado la detección de WebView en la secuencia de comandos de la página web para agregar la clase "baja calidad" al cuerpo HTML. Por cierto. Puede rastrear fácilmente WebView configurando user-agent en la configuración de WebView. Luego creé una nueva regla de CSS
body.lowquality * { filter: none !important; }
Prueba esto:
mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
Si está vinculado al evento onclick
, puede ser lento en pantallas táctiles.
Para hacerlo más rápido, utilizo fastclick , que usa los eventos táctiles mucho más rápidos para imitar el evento click.
Si solo hay algunos pocos componentes de su vista web que son lentos o lentos, intente agregar esto a los elementos css:
transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);
Este ha sido el único speedhack que realmente tuvo un efecto en mi vista web. ¡Pero ten cuidado de no abusar de eso! (Puedes leer más sobre el truco en este artículo ).