Android webview在低于5.0(棒棒糖)的速度很慢,但在5.0中运行正常

时间:2015-09-08 11:53:43

标签: android webview android-webview

我在5.0以下的android(棒棒糖)加载url时遇到问题 加载数据太慢,但在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>

2 个答案:

答案 0 :(得分:2)

借助Android 4.4(2013年10月),Google切换了WebView to use the Chromium rendering engine - 此举带来了显着的速度提升,众多新API以及使用Chrome DevTools进行远程调试的能力。

根据此Google’s documentation,他们更新了Android 5.0中的更多其他功能,为网络视图带来了更高的性能。

  

Android 5.0的初始版本包含一个版本的Chromium for   WebView基于Chromium M37版本,增加了对WebRTC的支持,   WebAudio和WebGL。

     

Chromium M37还包括对所有Web的本机支持   组件规格:自定义元素,Shadow DOM,HTML Imports,   和模板。这意味着您可以使用Polymer及其材料设计   WebView中的元素,无需填充。

     

虽然自Android 4.4以来WebView一直基于Chromium,但是   Chromium图层现在可以从Google Play更新。

因此,根据webview中的高端更改,它可以有效地加载数据,与较低版本进行比较。

对于您的问题,您可以加快您的案例中的Android webview性能,例如Android webview slowAndroid WebView performance或类似Android webview loading data performance very slow

Hardware Acceleration vll诀窍。你可以在你的应用程序的不同级别使用它answer我也提到了其他类型。

我认为以下效果最佳:

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

希望这个答案能帮助你。

答案 1 :(得分:0)

尝试

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