Android webview加载数据性能非常慢

时间:2015-08-31 04:58:53

标签: android android-activity webview android-webview

您好我正在处理一个应用程序,因为我使用的是Android WebView。 每当我启动webview活动时,从test.txt文件加载字符串html格式的数据。 test.txt文件包含近2.5 MB的数据,加载test.txt文件后,如果幻灯片屏幕结束,则读取所有数据并按回。 然后,随后启动webview活动需要更多时间来呈现数据。在第一次推出webview时,它花费的时间很少。 在启动此活动之间,我没有收到任何错误/异常/崩溃。

我使用的是Android API等级18及以上

注意:我对此问题进行了大量研究。我尝试使用Android webview slowAndroid WebView performance无法使用解决方案。

我无法使 android:hardwareAccelerated =" true" < - 为什么因为它有很多副作用(我仍然使用这个,但没有我在这个问题上发现的变化)。

我无法使用 的 webview.getSettings()setRenderPriority(RenderPriority.HIGH);

setRenderPriority() - >此方法在API级别18中已弃用。                         建议不要调整线程优先级,将来版本不支持此功能。

我的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>

如果你在这个问题上有任何解决方法,请告诉我。

2 个答案:

答案 0 :(得分:56)

我认为以下效果最佳:

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, the browser and the Chrome WebView

Hardware Acceleration也是诀窍。您可以在应用程序的不同级别使用它。

申请级别

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

但正如你在问题中已经提到的那样,你能详细说明这方面的副作用吗?

答案 1 :(得分:2)

如果有人最终仍然在试图让WebViews渲染速度更快,那么请尝试Crosswalk's XWalkView。在我们的应用程序中做出了巨大的改变。