Android webview加载数据性能很慢

Posted

技术标签:

【中文标题】Android webview加载数据性能很慢【英文标题】:Android webview loading data performance very slow 【发布时间】:2015-11-25 01:46:57 【问题描述】:

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

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

注意:我对这个问题做了很多研究。我尝试了Android webview slow 和Android 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_
    android:layout_
    android:orientation="vertical">

    <WebView
        android:layout_
        android:layout_
        android:id="@+id/text">
    </WebView>

</LinearLayout>

如果您对此问题有任何解决方法,请告诉我。

【问题讨论】:

简单地启用 setJavaScriptEnabled 会使速度变慢。目前我没有找到原因 【参考方案1】:

我认为以下方法效果最好:

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

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

【讨论】:

请贴出副作用!启用硬件加速以更快地加载我认为不必要的 WebView。 @King of Masses 请在视图级别将 LAYER_TYPE_SOFTWARE 更改为 LAYER_TYPE_HARDWARE @Jorgesys 如果您知道有副作用,请详细说明?【参考方案2】:

我尝试了下面的代码,它对我来说工作得更快

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

【讨论】:

setRenderPriority() 方法现已弃用【参考方案3】:

如果有人最终在这里仍然拼命试图让 WebView 渲染得更快,请尝试 Crosswalk's XWalkView。为我们的应用带来了巨大的改变。

【讨论】:

它是no longer supported

以上是关于Android webview加载数据性能很慢的主要内容,如果未能解决你的问题,请参考以下文章

自Lollipop以来,WebView的膨胀速度很慢

Android Webview 的 ClearCache 很慢

一手遮天 Android

WebView加载不出Html5网页的解决方法,android studio 拾色器,ViewPager高度问题

Android系统 WebView是啥?有啥用?

Android中WebView加载速度优化