web-dev-qa-db-fra.com

Android webview chargement des performances de données très lente

Bonjour, je travaille sur une application. En ce sens, j'utilise Android WebView. Chaque fois que je lance une activité de visualisation Web, le chargement de données au format chaîne html à partir du fichier test.txt. Le fichier test.txt contient près de 2,5 MB données, après le chargement du fichier test.txt, si vous faites glisser l’écran pour lire toutes les données et appuyez sur la touche retour, puis le lancement ultérieur de l’activité Webview prenant plus de temps pour restituer les données. Lors du premier lancement de la visualisation Web, sa durée minimale toute erreur/exception/blocage entre le lancement de cette activité.

J'utilise Android API de niveau 18 et supérieur

Remarque: J'ai fait beaucoup de recherches sur ce sujet. J'ai essayé la solution de Webview Android lente et performance d'Android WebView aucune utilisation.

Je ne peux pas faire Android: hardwareAccelerated = "true" <- pourquoi parce qu'il a beaucoup d'effets secondaires (j'ai quand même utilisé celui-ci, mais pas changements que j'ai trouvés sur cette question).

Je ne peux pas utiliser webview.getSettings (). SetRenderPriority (RenderPriority.HIGH);

setRenderPriority () -> Cette méthode est obsolète dans l'API de niveau 18. Il n'est pas recommandé d'ajuster les priorités des threads et cela ne sera plus pris en charge à l'avenir. versions.

Ma classe 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();
    }
}

mon fichier 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>

s'il vous plaît laissez-moi savoir si vous avez un travail autour de cette question.

32
Android learner

Je pense que ce qui suit fonctionne le mieux:

if (Build.VERSION.SDK_INT >= 19) {
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}       
else {
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Android 19 a le moteur de chrome pour WebView. Je suppose que cela fonctionne mieux avec l'accélération matérielle.

Pour plus d'informations Android 4.4 KitKat, le navigateur et le Chrome WebView

Accélération matérielle fait aussi l'affaire. Vous pouvez l'utiliser à différents niveaux dans votre application.

Niveau d'application

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

Niveau d'activité

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

Niveau de la fenêtre

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

Voir le niveau

myView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

Mais comme déjà mentionné dans votre question, pouvez-vous préciser les effets secondaires?

57
King of Masses

J'ai essayé ci-dessous le code son travail plus rapide pour moi

// 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);
}
6
Raja Peela

Si quelqu'un finit encore ici se frapper la tête contre le mur pour tenter de rendre WebViews plus rapide, essayez XWalkView de Crosswalk . Fait une énorme différence dans notre application.

2
airowe