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