Vista web de Android lenta

Mis vistas de Android son lentas. Esto está en todo de los teléfonos a las tablillas 3.0+ con especificaciones más que adecuadas

Sé que las webs se supone que son "limitadas", pero veo aplicaciones web hechas con la brecha de teléfono que debe estar utilizando todo tipo de CSS3 y JQuery brujería, que funcionan muy bien y rápido

Así que estoy perdiendo algo, ¿hay algún tipo de myWebview.SPEEDHACK(1) que puedo usar para acelerar las cosas? Gracias

También, a veces el contenido de mi webview simplemente no carga, en lugar de cargar lentamente, simplemente no carga. El activo con el que estoy probando se almacena localmente, sin errores.

Depende de la aplicación web que se está cargando. Pruebe algunos de los siguientes enfoques:

Establecer prioridad de render más alta (obsoleto de la API 18+):

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

Habilitar / deshabilitar 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); } 

Desactive la caché (si tiene problemas con su contenido):

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

La adición de este android:hardwareAccelerated="true" en el manifiesto fue la única cosa que mejoró significativamente el rendimiento para mí

Más información aquí: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel

La solución para nosotros fue lo contrario. Inhabilitamos la aceleración de hardware en WebView solamente (en lugar de en toda la aplicación en el manifiesto) utilizando 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

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 motor Chromium para WebView. Supongo que funciona mejor con la aceleración de hardware.

Estaba teniendo este mismo problema y tuve que resolverlo. He intentado estas soluciones, pero al final el rendimiento, al menos para el desplazamiento no mejoró en absoluto. Así que aquí el workaroud que hice realizar y la explicación de por qué funcionó para mí.

Si tuviera la oportunidad de explorar los eventos de arrastre, solo un poco, creando una clase "MiWebView", sobrescribiendo el método "onTouchEvent" y al menos imprimiendo el tiempo en que se produce cada evento de arrastre, verá que están separados En el 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 vea la función onTouchEvent. Es simplemente imposible para que sea manejado por el procesador en menos de 9ms (Keep on dreaming !!!). Es por eso que constantemente ves la "Miss una arruga como estamos esperando la respuesta de WebCore para touch down". mensaje. El código no se puede manejar a tiempo.

¿Como arreglarlo? En primer lugar, no se puede volver a escribir el código onTouchEvent para mejorarlo, es demasiado. Pero, usted puede "burlarse" para limitar la tasa de eventos para arrastrar los movimientos digamos a 40ms o 50ms. (Esto depende del procesador).

Todos los eventos táctiles son los siguientes: ACTION_DOWN -> ACTION_MOVE …… ACTION_MOVE -> ACTION_UP. Así que tenemos que mantener los movimientos hacia abajo y hacia arriba y filtrar la tasa de movimiento (estos son los chicos malos).

Y aquí hay una manera de hacerlo (puedes agregar más tipos de eventos como tocar con 2 dedos, todo lo que me interesa es el desplazamiento de 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, utilice esta clase en lugar de WebView y verá la diferencia al desplazarse.

Este es sólo un enfoque para una solución, pero aún no se ha implementado completamente para todos los casos de retraso debido al toque de pantalla al utilizar WebView. Sin embargo, es la mejor solución que encontré, al menos para mis necesidades específicas.

He probado todas las propuestas para solucionar el problema de rendimiento de rendimiento en mi aplicación phonegap. Pero nada realmente funcionó.

Finalmente, después de un día entero de búsqueda, lo hice. Me establezco 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://stackoverflow.com/a/24467920/3595386

Si sólo hay algunos componentes de su webview que es lento o laggy, 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 webview. Pero tenga cuidado de no abusar de ella! (Puede leer más sobre el hack en este artículo .)

Ninguna de esas respuestas me fue de ayuda.

Finalmente he encontrado razón y 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 escritura de la página web para agregar la clase "lowquality" al cuerpo del HTML. Por cierto Puede seguir fácilmente WebView estableciendo el agente de usuario en la configuración de WebView. Entonces creé una nueva regla 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 las pantallas táctiles.

Para hacerlo más rápido, utilizo fastclick , que utiliza los eventos táctiles mucho más rápidos para imitar el evento click.

  • Android WebView canGoBack siempre es cierto
  • No se carga el PDF de Android en el navegador y en WebView
  • Vista web de Android dentro de un servicio?
  • Cómo buscar texto en la vista web
  • Android: Callbacks con componente WebView?
  • Campo de texto en WebView en un Android está oculto por el teclado
  • Android webView saveState
  • WebView height = wrap_content con cambiar el tamaño de fuente no funciona
  • Webview html formulario de entrada no mostrar / permitir el teclado
  • Mejorar el rendimiento de webView (debe tener el mismo rendimiento que el navegador web nativo)
  • ¿Cómo puedo mostrar un documento PDF en una vista Web?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.