Android webview 在 5.0(lollipop) 以下很慢,但在 5.0 中 运行 很好

Android webview is slow in below 5.0(lollipop) but in 5.0 it running fine

我在 android 中加载 url 低于 5.0(棒棒糖)时遇到问题 加载数据太慢,但在 android 5.0 或更高版本中工作正常。如何解决这个问题? I have follow this link。 & How to improve webview load time

我的密码是

   @SuppressLint({ "SetJavaScriptEnabled", "DefaultLocale" })
      public class YS_WebViewActivity extends Activity
     {
    private Button btnDone;
    private WebView webViewLoadUrl;
    private YS_GeneralUtility generalUtility;
    private Dialog alertDialogBox;
    private String url = "";
    private TextView tvLoading;
    private Button btnCancel;
    private Button btnRetry;

    @SuppressLint("InlinedApi")
    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_webview);
        btnDone = (Button) findViewById(R.id.btnDone);
        webViewLoadUrl = (WebView) findViewById(R.id.webViewLoadUrl);
        //webViewLoadUrl.setBackgroundColor(Color.parseColor("#123456"));
        tvLoading = (TextView) findViewById(R.id.tvLoading);
        url = getIntent().getExtras().getString("url");
        webViewLoadUrl.setVisibility(View.INVISIBLE);
        generalUtility = new YS_GeneralUtility(this);

        webViewLoadUrl.getSettings().setJavaScriptEnabled(true); // enable javascript
        try {
            webViewLoadUrl.getSettings().setRenderPriority(RenderPriority.HIGH); 
            webViewLoadUrl.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
            webViewLoadUrl.getSettings().setDomStorageEnabled(true);
            webViewLoadUrl.getSettings().setAllowFileAccess(true);
            webViewLoadUrl.getSettings().setAllowContentAccess(true);
            webViewLoadUrl.getSettings().setAllowFileAccessFromFileURLs(true);
            //webViewLoadUrl.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_NEVER_ALLOW);
        } catch (Exception e) {
            e.printStackTrace();
        }
        tvLoading.setTypeface(generalUtility.faceAvenirLight);
        btnDone.setTypeface(generalUtility.faceAvenirMedium);
        btnDone.setOnClickListener(new OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                myErrorFinish();
            }
        });
        webViewLoadUrl.setWebViewClient(new WebViewClient()
        {
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                //Log.i(TAG, "Processing webview url click...");
                view.loadUrl(url);
                return true;
            }

            public void onPageFinished(WebView view, String url)
            {
                //Log.i(TAG, "Finished loading URL: " + url);
                webViewLoadUrl.setVisibility(View.VISIBLE);
                tvLoading.setVisibility(View.INVISIBLE);
            }

            String errorData = "<html><head></head>"
                    + "<body style=' font-family:Avenir !important;font-weight:lighter !important; color:#ffffff; margin : 0px auto;'>"
                    + "<div style = 'width : 100% ; height : 100% ; background:#123456;'> </div>"
                    + "</body></html>";

            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
            {
            //  Log.e(TAG, failingUrl + "Error: " + description);
                view.loadData(errorData, "text/html", "UTF-8");
                alertDialogOnInternetOff(getString(R.string.errorMsgInternet));
                // finish();
            }
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                super.onReceivedSslError(view, handler, error);
                handler.proceed();
            }
        });

        webViewLoadUrl.loadUrl(url);
        // setContentView(webview);
    }


    private void alertDialogOnInternetOff(String message)
    {
        alertDialogBox = new Dialog(YS_WebViewActivity.this, R.style.InternetErrorPopup);
        alertDialogBox.requestWindowFeature(Window.FEATURE_NO_TITLE);
        alertDialogBox.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        alertDialogBox.setContentView(R.layout.internetpopup_dialog);
        alertDialogBox.setCancelable(false);
        alertDialogBox.show();
        btnCancel = (Button) alertDialogBox.findViewById(R.id.btnCancel);
        btnRetry = (Button) alertDialogBox.findViewById(R.id.btnRetry);
        TextView txtExitMessage = (TextView) alertDialogBox.findViewById(R.id.textViewMessage);
        TextView horizontalLinePopup = (TextView) alertDialogBox.findViewById(R.id.horizontalLinePopup);
        TextView verticalLinePopup = (TextView) alertDialogBox.findViewById(R.id.verticalLinePopup);
        horizontalLinePopup.setBackgroundColor(getResources().getColor(R.color.internetpopupBorderinnerpageColor));
        verticalLinePopup.setBackgroundColor(getResources().getColor(R.color.internetpopupBorderinnerpageColor));
        txtExitMessage.setTypeface(generalUtility.faceAvenirLight);
        btnCancel.setTypeface(generalUtility.faceAvenirLight);
        btnRetry.setTypeface(generalUtility.faceAvenirLight);
        txtExitMessage.setText(R.string.errorMsgInternet);
        btnCancel.setText(R.string.cancel);
        btnRetry.setText(R.string.retry);
        alertDialogBox.setCancelable(false);
        btnCancel.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v) 
            {
                alertDialogBox.dismiss();
                Log.d("AlertDialog", "Negative");
                YS_WebViewActivity.this.finish();
            }
        });
        btnRetry.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                alertDialogBox.dismiss();
                Log.d("AlertDialog", "Positive");
                tvLoading.setVisibility(View.VISIBLE);
                webViewLoadUrl.loadUrl(url);

            }
        });
    }
    private void myErrorFinish() 
    {
        /*
         * Jump to the Setting Screen on pressing back button of device
         */
        YS_WebViewActivity.this.finish();
        //overridePendingTransition(R.anim.abc_slide_in_bottom, R.anim.abc_slide_out_bottom);
    }

    @Override
    public void onBackPressed() 
    {
        myErrorFinish();
        super.onBackPressed();
    }
  }

这是XML...

     <RelativeLayout 
        android:id="@+id/RelativeLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/listback"
        android:orientation="vertical" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="42dip"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:background="@drawable/navigationbackground" />

    <Button
        android:id="@+id/btnDone"
        android:layout_width="wrap_content"
        android:layout_height="42dip"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="@android:color/transparent"
        android:text="@string/done"
        android:textColor="@android:color/white"
        android:textSize="17sp" />

    <WebView
        android:id="@+id/webViewLoadUrl"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/btnDone"
        android:layout_centerVertical="true" />

    <TextView
        android:id="@+id/tvLoading"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center"
        android:text="@string/loading"
        android:textColor="@android:color/white"
        android:textSize="18sp" />


    </RelativeLayout>

尝试

webview.getSettings().setRenderPriority(RenderPriority.HIGH);
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

随着 Android 4.4(2013 年 10 月),Google 改变了它的 WebView to use the Chromium rendering engine — 这一举措带来了显着的速度改进、大量新的 API 以及远程调试的能力Chrome 开发工具。

根据这个 Google’s documentation 他们在 Android 5.0 中更新了一些额外的功能,为 webview 带来了更高的性能。

The initial release for Android 5.0 includes a version of Chromium for WebView based on the Chromium M37 release, adding support for WebRTC, WebAudio, and WebGL.

Chromium M37 also includes native support for all of the Web Components specifications: Custom Elements, Shadow DOM, HTML Imports, and Templates. This means you can use Polymer and its material design elements in a WebView without needing polyfills.

Although WebView has been based on Chromium since Android 4.4, the Chromium layer is now updatable from Google Play.

因此,根据 webview 中的高端变化,与低版本相比,它可以更有效地加载数据。

对于你的问题,你可以在你的情况下加快 android webview 性能,比如 Android webview slow and Android WebView performance or like

Hardware Acceleration vll do's the trick.You can use it in different levels in your application in this 我也提到了其他类型

我认为以下效果最好:

if (Build.VERSION.SDK_INT >= 19) {
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}       
else {
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

希望这个回答对您有所帮助。

如果在所有其他答案之后您的问题仍然存在,那么您需要测试您的URL/server响应和数据格式