先用get方式获取网页数据,从网页数据里面找出对应的图片、swf的路径,将这些路径替换成你本地的文件路径,并将这个替换好的内容保存到本地网页文件,然后再让webView加载这个本地的网页文件。

解决方案 »

  1.   

    缓存涉及到的东西太多了,完全看不明白,当时想的是看懂这个机制,然后重写webview,但是一看下来,发现涉及到的类远不止webview这么简单,webview加载网页,是很多类、模块协同操作的,单单重写webview根本无事于补,感觉只能将webview加载页面这一块完全重写……就算花几个月弄明白了缓存机制,也没法把它用到项目中来,因为我做的是应用不是系统定制,就算修改了源码,也影响不到用户的机器……纠结啊
      

  2.   

    谢谢,这个方法已经试过,然后排除了,因为涉及到的问题很多,这样做的话甚至比改服务器页面更复杂:
    1、如何筛选页面的图片标签,是个大问题,要将网页存下来慢慢判断,还不如直接修改页面,相信那样工作量要小得多(可能android有筛选机制,但页面设计时没考虑会遇到这个问题,所以页面设计很混乱,比如很多标签写在一行,这也增大了筛选的难度)2、就算第一个问题解决了,但项目中,并不是所有的图片都要放在本地,如何判断要替换哪些图片又是问题这两个是最大的问题,还有很多小问题、细节等……所以,现在只能想办法不去动页面(不论是服务器还是将页面保存再改),同时实现这个功能
      

  3.   

    可以把要求替换的图片url和要替换的图片地址保存到数据库,以后在html中数据直接查数据库,得到要替换的图片地址,如果没有查询到就直接用html里的url.
      

  4.   

    在用替换查找时,还可以有第三方包比较容易找,jsoup.jar
      

  5.   

    现在回答这个两年前的问题,目前根据Android版本分布,如果可以忽略掉3.0以下这部分功能的支持,可以使用shouldInterceptRequest。WebView webView = new WebView(this);
    webView.setWebViewClient(new WebViewClient() {  @Override
      public WebResourceResponse shouldInterceptRequest(WebView view,  String url) {
          Log.i(LOGTAG, "shouldInterceptRequest url=" + url + ";threadInfo" + Thread.currentThread());
          WebResourceResponse response = null;
          if (url.contains("logo")) {
              try {
                  InputStream localCopy = getAssets().open("droidyue.png");
                  response = new WebResourceResponse("image/png", "UTF-8", localCopy);
              } catch (IOException e) {
                  e.printStackTrace();
              }        
          }
          return response;
      }    
    });
    setContentView(webView);
    webView.loadUrl("http://m.sogou.com");
    具体可以参考这篇文章http://droidyue.com/blog/2014/11/23/block-web-resource-in-webview/