【原创】踩webView加载html源码的坑

来源:互联网 发布:找一份网络兼职 编辑:程序博客网 时间:2024/06/08 13:24

前言

对与移动端开发WebView的开发是必不可少的,关与webView 的一些常规使用大家可以参照  WebView·开车指南 

今天在这里讲的是一个WebView加载html的一个大坑,具体现象描述就是webView加载html之后,点击内部的超链接,跳转...... ,然后回退到之前html的时候页面一片空白,

也不会像加载网页之后,也不显示用户该页面加载失败,实在把我恶心坏了。吐槽之后,我们想想如何解决这个问题呢?

思路

WebView加载html代码绝大多数情况下,只会加载一次且是刚进入页面的时候进行加载,而我们页面加载的异常bug,就是WebView.goBack()的时候回退到webView的初始状态时,html代码在内存中已经被回收了,看到这里我们的思路就来了:

1.当WebView加载html代码时,我们将这个html代码,设置一个变量把html代码保存起来

private  String  mHtml;   //  webView内部html代码的全局变量

@Overrideprotected void onCreate(Bundle bundle) {    super.onCreate(bundle)    loadDataUrl(this, mWebView);}/** * 加载html * @param activity * @param webView */public void  loadDataUrl(Activity activity, WebView webView){    String html = activity.getIntent().getStringExtra(WebActivity.HTML);    LogUtil.e(WebActivity.TAG, "html=====>" + html);    if (TextUtils.isEmpty(html)) {return;}    webView.loadDataWithBaseURL(null, html, "text/html", "utf-8",null);    mHtml=html;  // 将html代码保留在内存中}

2.WebView回退到初始加载html时候,再次把html源码加载一次

     (1)通过调试我们从webView.getUrl( )这个值中看到了,加载html和加载url 的区别所在
      // 加载html代码时,webView.getUrl()=="about:blank" 这个值可以标识富文本
public static final String HTML_TAG="about:blank";
     (2)  回退到初始阶段的时候,重新加html
  mWebView.setWebViewClient(new  WebViewClient() {     ......          // WebView
          @Override          public void onPageFinished(WebView webView, String s) {            .........            WebBackForwardList webBackForwardList=mWebView.copyBackForwardList();        //       获取WebView 加载的历史数据            int index = webBackForwardList.getSize();                                    //       获取堆栈中的历史数据长度            if(mWebView.getUrl().equals(HTML_TAG)&&index>1&&!TextUtils.isEmpty(mHtml)){  //       满足上述bug的条件            mWebView.clearHistory();                                                     //       恢复WebView到初始状态              mWebView.loadDataWithBaseURL(null, mHtml, "text/html", "utf-8",null);        //       重新加载这个情况           }         }    .....  }

小结

上述处理该问题的逻辑,其实不算特别严谨,也是因为解决这个特殊的bug,且没有牵涉到具体的业务逻辑的情况下的代码,希望大家可以提出宝贵的意见或建议。