ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 低调看体育直播 >> CSSjrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播 >> Android 拦截WebView加载URL,控制其加载CSS、JS资源

Android 拦截WebView加载URL,控制其加载CSS、JS资源(1/3)

来源:网络整理     时间:2015-10-30     关键词:WebView,Exception,开发经验,请求方式,html代码

本篇文章主要介绍了" Android 拦截WebView加载URL,控制其加载CSS、JS资源",主要涉及到WebView,Exception,开发经验,请求方式,html代码方面的内容,对于CSSjrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: 绪论最近在项目中有了这样一个需求,我们都知道WebView加载网页可以缓存,但是web端想让客服端根据需求来缓存网页,也就是说web端在设置了http响应头,我...

绪论

最近在项目中有了这样一个需求,我们都知道WebView加载网页可以缓存,但是web端想让客服端根据需求来缓存网页,也就是说web端在设置了http响应头,我根据这个头来拦截WebView加载网页,去执行网络加载还是本地缓存加载。这个需求之前一直没听说过,在网上搜了一下,发现有拦截WebView加载网页这个方法,研究了一下,最终实现了,今天小编分享给大家这个开发经验

WebView缓存机制

1.缓存模式

Android的WebView有五种缓存模式
1.LOAD_CACHE_ONLY //不使用网络,只读取本地缓存数据
2.LOAD_DEFAULT //根据cache-control决定是否从网络上取数据。
3.LOAD_CACHE_NORMAL //API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
4.LOAD_NO_CACHE //不使用缓存,只从网络获取数据
5.LOAD_CACHE_ELSE_NETWORK //只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据

2.缓存路径

/data/data/包名/cache/
/data/data/包名/database/WebView.db
/data/data/包名/database/WebViewCache.db

3.设置缓存模式

mWebSetting.setLoadWithOverviewMode(true);
        mWebSetting.setDomStorageEnabled(true);
        mWebSetting.setAppCacheMaxSize(1024 * 1024 * 8);//设置缓存大小
        //设置缓存路径
        appCacheDir = Environment.getExternalStorageDirectory().getPath() + "/xxx/cache";
        File fileSD = new File(appCacheDir);
        if (!fileSD.exists()) {
            fileSD.mkdir();
        }
        mWebSetting.setAppCachePath(appCacheDir);
        mWebSetting.setAllowContentAccess(true);
        mWebSetting.setAppCacheEnabled(true);
        if (CheckHasNet.isNetWorkOk(context)) {
            //有网络网络加载
            mWebSetting.setCacheMode(WebSettings.LOAD_DEFAULT);
        } else {
            //无网时本地缓存加载
            mWebSetting.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
        }

4.清除缓存

/**
     * 清除WebView缓存
     */publicvoidclearWebViewCache(){ 

        //清理WebView缓存数据库 try { 
            deleteDatabase("WebView.db");  
            deleteDatabase("WebViewCache.db"); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 

        //WebView 缓存文件 
        File appCacheDir = new File(getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME); 
        Log.e(TAG, "appCacheDir path="+appCacheDir.getAbsolutePath()); 

        File WebViewCacheDir = new File(getCacheDir().getAbsolutePath()+"/WebViewCache"); 
        Log.e(TAG, "WebViewCacheDir path="+WebViewCacheDir.getAbsolutePath()); 

        //删除WebView 缓存目录 if(WebViewCacheDir.exists()){ 
            deleteFile(WebViewCacheDir); 
        } 
        //删除WebView 缓存 缓存目录 if(appCacheDir.exists()){ 
            deleteFile(appCacheDir); 
        } 
    }

好了,我们了解了WebView的缓存缓存机制了之后来看看到底怎么拦截WebView加载网页:

实现原理

1.要想拦截WebView加载网页我们必须重写WebViewClient类,在WebViewClient类中我们重写shouldInterceptRequest()方法,看方法名一目了然,拦截http请求,肯定是这个方法。
2.获取http请求的头,看是否包含所设置的flag,如果包含这个flag说明web端想让我们保存这个html,那么我们改怎么手动保存这个html呢?
1)获取url的connection
2)利用connection.getHeaderField(“flag”)获取http请求头信息
3)得到请求的内容区数据的类型String contentType = connection.getContentType();
4)获取html的编码格式
5)将html的内容写入文件(具体代码下面会介绍)
*3.注意:因为控制WebView加载网页的方法需要三个参数
public WebResourceResponse(String mimeType, String encoding, InputStream data)
mimeType:也就是我们第3步获取的内容区数据的类型
encoding:就是html的编码格式
data:本地写入的html文件*


那么问题来了,我们可以把html代码写到本地缓存文件中,而这个html所对应的mimeType和encoding我们存到哪里呢?因为http的头信息是http请求的属性,我们存到SP中?存到数据库中?好像都不行,无法对应关系啊。这块小编想了好久,因为小编没怎么写过文件读取这一块,最后想到把这两个参数一起存到html文件开始的几个字节,每次加载先读取这两个参数就OK了,不过这样读写比较麻烦,也比较费时,但是却给后台减少了不小的压力。看一下代码具体怎么实现的吧。

相关图片

相关文章