[Android]WebView搭载WebContent时,网页加载速度太慢的对应策

来源:互联网 发布:简约博客网站源码 编辑:程序博客网 时间:2024/06/10 18:02

WebView搭载服务器端html, js,请求图片大,请求次数多的情况下,网页加载速度很慢。

网页加载速度慢这个问题Native+web content混合模式下如何一定程度上改善呢,这篇小文里探讨一下。

(1)缓存模式。

setCacheMode方法可以设置缓存模式。

缓存模式有5种。意义如下。(转载自网络)

LOAD_CACHE_ONLY:  不使用网络,只读取本地缓存数据

LOAD_DEFAULT:  根据cache-control决定是否从网络上取数据。

LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式

LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.

LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。


当设置Load_default时,由服务器端的cache-control决定是否使用缓存。服务器端cache-control设为no-cache时,

无论如何都会从网络上取数据。


我们项目服务器端用的cache-control设置的no-cache,所以缓存策略设置为load_default,但是实际上却没有什么卵用。

如果服务器端cache-control设置为cache时,确实网页加载速度变得非常快。


(2)图片或者大的JS文件本地保存

拦截http请求,如果请求图片或者大size的JS文件,比如jquery库, jquery mobile库,直接从本地取得资源并返给web端。

重写WebViewClient的shouldInterceptRequest方法。

<思路>

拦截url,从url得到文件后缀和名字。判断本地是否有此文件。有则通过本地文件得到WebResourceResponse实例返回。


贴代码如下。

                                     @Override
                                      public WebResourceResponse shouldInterceptRequest(WebView view, String url) {                                      
                                            WebResourceResponse response = null;

                                          InputStream localCopy = null;


                                          //response by default
                                          response =  super.shouldInterceptRequest(view, url);

                                          //if local file, then response local content
                                          String mineType = "image/png"; //for png file
                                          String[] urlSplit = url.split("/");
                                          String fileName = null;
                                          if ((urlSplit != null) && (urlSplit.length != 0)) {
                                              fileName = urlSplit[urlSplit.length-1];
                                              if (fileName.endsWith("js")) {
                                                  //for js file
                                                  mineType = "application/javascript";
                                              } else if (fileName.endsWith("gif")){
                                                  mineType ="image/gif";
                                              } else {
                                                  return response;
                                              }
                                          }


                                          if ((fileName != null) && (cacheFile != null)) {
                                              for (String cacheFileName : cacheFile) {
                                                  if (fileName.equals(cacheFileName)) {
                                                      try {
                                                          localCopy = MyApplication.getInstance().getAssets().open(cacheDir + "/"+ cacheFileName);
                                                          response = new WebResourceResponse(mineType, "UTF-8", localCopy);
                                                            } catch (IOException e) {
                                                          e.printStackTrace();
                                                      }
                                                  }
                                              }
                                          }
                                          return response;
                                      }

0 0
原创粉丝点击