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);
}