Android webview carga el rendimiento de los datos muy lento

Hola, estoy trabajando en una aplicación, en la que estoy usando Android WebView. Cada vez que inicio la actividad de vista web, cargando datos en formato html de cadena desde el archivo test.txt. El archivo test.txt contiene casi 2.5 MB de datos, después de cargar el archivo test.txt, si la pantalla de diapositivas termina para leer todos los datos y presionar hacia atrás. Luego, el lanzamiento posterior de la actividad de la vista web requiere más tiempo para procesar los datos. En el primer lanzamiento de la vista web, se requiere un tiempo mínimo. No recibo ningún error / excepción / locking entre el lanzamiento de esta actividad.

Estoy usando Android API nivel 18 y superior

Nota: Hice mucha investigación sobre este tema. Probé la solución de Android webview slow y el rendimiento de Android WebView sin uso.

No puedo hacer android: hardwareAccelerated = “true” <- why porque tiene muchos efectos secundarios (Todavía usé este, pero no encontré cambios en este tema).

No puedo usar webview.getSettings (). SetRenderPriority (RenderPriority.HIGH);

setRenderPriority () -> Este método ha quedado obsoleto en el nivel de API 18. No se recomienda ajustar las prioridades de subprocesos, y esto no se admitirá en futuras versiones.

Mi clase DataLoader.java

public class DataLoader extends Activity { private WebView webView = null; // Progress Dialog private ProgressDialog progressDialog; String dataContent = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.web_view); webView = (WebView)findViewById(R.id.text); // Loading webview in Background Thread new LoadWebView().execute(); } class LoadWebView extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = new ProgressDialog(DataLoader.this); progressDialog.setTitle("Loading..."); progressDialog.setMessage("Please wait."); progressDialog.setCancelable(false); progressDialog.setIndeterminate(true); progressDialog.show(); } protected String doInBackground(String... args) { // AssetFileReader read the txt file and return data in the form of string dataContent = AssetFileReader.read(getApplicationContext(), "test.txt"); return null; } protected void onPostExecute(String str) { // dismiss the dialog progressDialog.dismiss(); if (dataContent != null) { // updating UI from Background Thread runOnUiThread(new Runnable() { public void run() { WebSettings s = webView.getSettings(); s.setUseWideViewPort(true); s.setSupportZoom(true); s.setBuiltInZoomControls(true); s.setDisplayZoomControls(false); s.setJavaScriptEnabled(true); webView.loadData(dataContent, "text/html", "utf-8"); } }); } } } @Override public void onDestroy() { super.onDestroy(); webView.clearCache(true); webView.clearHistory(); } } 

mi archivo web_view.xml

      

por favor, avíseme si tiene alguna solución a este problema.

Creo que lo siguiente funciona mejor:

 if (Build.VERSION.SDK_INT >= 19) { 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.

Para obtener más información sobre Android 4.4 KitKat, el navegador y Chrome WebView

La aceleración de hardware también es el truco. Puede usarlo en diferentes niveles en su aplicación.

Nivel de aplicación

  

Nivel de actividad

     

Nivel de ventana

 getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 

Nivel de vista

 myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

Pero como ya se mencionó en su pregunta, ¿puede explicar los efectos secundarios de esto?

He intentado a continuación el código funciona más rápido para mí

 // For API level below 18 (This method was deprecated in API level 18) webview.getSettings().setRenderPriority(RenderPriority.HIGH); webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); if (Build.VERSION.SDK_INT >= 19) { webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); } else { webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } 

En caso de que alguien termine aquí golpeando sus cabezas contra la pared tratando de hacer que las WebView se rindan más rápido, pruebe con XWalkView de Crosswalk . Hizo una gran diferencia en nuestra aplicación.