こんにちは、1つのアプリケーションに取り組んでいます。Android WebViewを使用しています。webviewアクティビティを起動するたびに、test.txtファイルから文字列html形式のデータを読み込みます。test.txtファイルには2.5 test.txtファイルを読み込んだ後、MBデータで、スライド画面を終了してすべてのデータを読み取り、押し戻す場合。その後、WebViewアクティビティを起動すると、データのレンダリングに時間がかかります。このアクティビティを起動する間のエラー/例外/クラッシュ。
Android APIレベル18以上を使用しています
注:私はこの問題について多くの研究をしました。 Android webview slow および Android WebView performance 使用しないでソリューションを試しました。
できませんAndroid:hardwareAccelerated = "true"<-なぜ多くの副作用があるのか(まだこれを使用しましたが、この問題で見つかった変更)。
私は使用できませんwebview.getSettings()。setRenderPriority(RenderPriority.HIGH);
setRenderPriority()->このメソッドはAPIレベル18で非推奨になりました。スレッドの優先度を調整することは推奨されず、今後サポートされません。バージョン。
My 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();
}
}
私の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>
この問題について回避策がある場合はお知らせください。
私は次のことが最もうまくいくと思います:
if (Build.VERSION.SDK_INT >= 19) {
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
else {
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
Android 19には、WebView用のChromiumエンジンがあります。ハードウェアアクセラレーションの方がうまく機能すると思います。
詳細については、 Android 4.4 KitKat、ブラウザ、およびChrome WebView
ハードウェアアクセラレーション もトリックです。アプリケーションのさまざまなレベルで使用できます。
アプリケーションレベル
<application Android:hardwareAccelerated="true" ...>
アクティビティレベル
<application Android:hardwareAccelerated="true">
<activity ... />
<activity Android:hardwareAccelerated="false" />
</application>
ウィンドウレベル
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
表示レベル
myView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
しかし、あなたの質問ですでに述べたように、これの副作用を詳しく説明できますか?
私は以下のコードを試してみました
// 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);
}
WebViewsのレンダリングを高速化しようとして、壁に頭を打ち付けている人がいる場合は、 CrosswalkのXWalkView を試してください。アプリに大きな違いをもたらしました。