web-dev-qa-db-ja.com

Androidウェブビューの読み込みデータのパフォーマンスが非常に遅い

こんにちは、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>

この問題について回避策がある場合はお知らせください。

32
Android learner

私は次のことが最もうまくいくと思います:

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

しかし、あなたの質問ですでに述べたように、これの副作用を詳しく説明できますか?

57
King of Masses

私は以下のコードを試してみました

// 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

WebViewsのレンダリングを高速化しようとして、壁に頭を打ち付けている人がいる場合は、 CrosswalkのXWalkView を試してください。アプリに大きな違いをもたらしました。

2
airowe