studio propiedades examples example app android android-activity webview android-webview

propiedades - Android webview carga datos de rendimiento muy lento



webview android studio 2018 (3)

Hola, estoy trabajando en una aplicación. En eso estoy usando Android WebView. Cada vez que lanzo la actividad webview, 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 se desliza la pantalla para terminar, lea todos los datos y presione Atrás. Luego, el lanzamiento subsiguiente de la actividad de webview demorando más tiempo en generar datos. En el primer lanzamiento de webview está tomando un tiempo mínimo. No recibo ningún error / excepción / bloqueo entre el inicio de esta actividad.

Estoy usando la API de Android de nivel 18 y superior

Nota: Hice mucha investigación sobre este tema. Probé Solution from Android webview slow y Android WebView performance no use.

No puedo hacer que android: hardwareAccelerated = "true" <- porque tiene muchos efectos secundarios (aún usé este, pero no encontré cambios en este problema).

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

setRenderPriority () -> Este método fue desaprobado en el nivel de API 18. No se recomienda ajustar las prioridades de subprocesos, y esto no será compatible 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<String, String, String> { @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

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <WebView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/text"> </WebView> </LinearLayout>

por favor, hágamelo saber si tiene algún trabajo alrededor de 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 un 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 cumple su función. Puede usarla en diferentes niveles en su aplicación.

Nivel de aplicación

<application android:hardwareAccelerated="true" ...>

Nivel de actividad

<application android:hardwareAccelerated="true"> <activity ... /> <activity android:hardwareAccelerated="false" /> </application>

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 elaborar los efectos secundarios para esto?


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


He intentado a continuación el código de su trabajo 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); }