Android WebView详解(加速加载篇) – 余炜的博客 – ITeye技术网站

当我们在使用WebView时,如果加载的网友比较大,这加载速度将非常慢。

现总结几种加速WebView加载的方法

1、提高渲染的优先级
webView.getSettings().setRenderPriority(RenderPriority.HIGH);

2、使用webView.getSettings().setBlockNetworkImage,把图片加载放在最后来加载渲染。参照示例1.

3,使用硬件加速,该功能在Android 3.0 (API level 11)才加入。具体参照:http://developer.android.com/guide/topics/graphics/hardware-accel.html

示例1:

 

  • package com.robin;

 

 

 

 

 

    1. import com.robin.R;
    2. import android.app.Activity;
    3. import android.app.Dialog;
    4. import android.app.ProgressDialog;
    5. import android.content.Context;
    6. import android.content.DialogInterface;
    7. import android.os.Bundle;
    8. import android.os.Handler;
    9. import android.os.Message;
    10. import android.util.Log;
    11. import android.view.View;
    12. import android.view.Window;
    13. import android.webkit.DownloadListener;
    14. import android.webkit.WebChromeClient;
    15. import android.webkit.WebSettings;
    16. import android.webkit.WebSettings.RenderPriority;
    17. import android.webkit.WebView;
    18. import android.widget.Button;
    19. import android.widget.Toast;

 

 

 

 

    1. /**

 

  •  * @author Administrator

 

 

  •  * 

 

 

  •  */

 

    1. public class MyActivity extends Activity {
    2. private WebView webView;
    3. final static String TAG = “MyActivity”;
    4. Handler handler = new Handler();
    5. boolean blockLoadingNetworkImage=false;
    6. //static long t=0;
    7. //static long t1=0;

 

  • String link;

 

    1. protected void onCreate(Bundle savedInstanceState) {
    2. super.onCreate(savedInstanceState);
    3. link = getIntent().getStringExtra(“url”);

 

  • setContentView(R.layout.news_details);

 

 

 

 

 

 

  • webView = (WebView) findViewById(R.id.webView);

 

    1. webView.getSettings().setBuiltInZoomControls(true);
    2. webView.getSettings().setJavaScriptEnabled(true);

 

  • webView.getSettings().setRenderPriority(RenderPriority.HIGH);

 

    1. webView.getSettings().setBlockNetworkImage(true);
    2. blockLoadingNetworkImage=true;
    3. webView.setWebChromeClient(new WebChromeClient() {
    4. public void onProgressChanged(WebView view, int progress) {
    5. // Activities and WebViews measure progress with different
    6. // scales.
    7. // The progress meter will automatically disappear when we reach
    8. // 100%
    9. //Log.i(TAG, “progress:” + progress);
    10. if(loadingProgressDialog!=null&&loadingProgressDialog.isShowing())

 

  • loadingProgressDialog.setProgress(progress);

 

    1. if (progress >= 100) {
    2. /*if(t==0)

 

  • t=System.currentTimeMillis()-t1;

 

 

  • else

 

 

  • t=(t+System.currentTimeMillis()-t1)>>1;

 

 

  • t1=System.currentTimeMillis()-t1;

 

 

  • Log.i(TAG, “t:” + t/1000+” t1:”+t1/1000);*/

 

    1. if(blockLoadingNetworkImage)

 

  • {

 

    1. webView.getSettings().setBlockNetworkImage(false);
    2. blockLoadingNetworkImage=false;

 

  • }

 

    1. if (loadingProgressDialog!=null&&loadingProgressDialog.isShowing())

 

  • dismissDialog(PROGRESS_DIALOG_CONNECTING);

 

 

  • }

 

 

  • }

 

 

  • });

 

    1. Runnable r = new Runnable() {
    2. public void run() {

 

  • webView.loadUrl(link);

 

    1. //t1=System.currentTimeMillis();
    2. Log.i(TAG, “url:” + link);

 

  • showDialog(PROGRESS_DIALOG_CONNECTING);

 

 

  • }

 

 

  • };

 

    1. handler.postDelayed(r, 200);

 

 

 

 

 

  • }

 

 

 

 

 

    1. protected void onResume() {
    2. super.onResume();
    3. if (webView.getProgress() < 100)

 

  • showDialog(PROGRESS_DIALOG_CONNECTING);

 

 

  • }

 

 

 

 

 

    1. protected void onDestroy() {

 

  • webView.stopLoading();

 

 

  • webView.destroy();

 

    1. super.onDestroy();

 

  • }

 

 

 

 

 

    1. final static int PROGRESS_DIALOG_CONNECTING = 1000;
    2. ProgressDialog loadingProgressDialog = null;

 

 

 

 

    1. @Override
    2. protected Dialog onCreateDialog(int id) {
    3. switch (id) {
    4. case PROGRESS_DIALOG_CONNECTING: {
    5. ProgressDialog progressDialog = new ProgressDialog(this);

 

  • progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

 

 

  • progressDialog.setMessage(getResources()

 

 

  • .getString(R.string.loading));

 

 

  • loadingProgressDialog = progressDialog;

 

    1. return progressDialog;

 

  • }

 

    1. default:
    2. break;

 

  • }

 

    1. return null;

 

  • }

 

 

 

 

 

    1. protected void onPrepareDialog(int id, Dialog dialog) {
    2. super.onPrepareDialog(id, dialog);
    3. switch (id) {
    4. case PROGRESS_DIALOG_CONNECTING: {
    5. loadingProgressDialog.setMax(100);

 

  • dialog.show();

 

 

  • }

 

    1. break;
    2. default:
    3. break;

 

  • }

 

 

  • }

 

 

 

 

 

 

  • }

 

来源URL:http://hunankeda110.iteye.com/blog/1807839