zoukankan      html  css  js  c++  java
  • Android WebView 缓存处理

    当我们加载Html时候,会在我们data/应用package下生成database与cache两个文件夹:
    我们请求的Url记录是保存在webviewCache.db里,而url的内容是保存在webviewCache文件夹下.
    WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即AppCache)。


    一、网页缓存

    1、缓存构成
    /data/data/package_name/cache/
    /data/data/package_name/database/webview.db

    /data/data/package_name/database/webviewCache.db


     

    综合可以得知 webview 会将我们浏览过的网页url已经网页文件(css、图片、js等)保存到数据库表中


    缓存模式(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,都使用缓存中的数据。
    如:www.taobao.com的cache-control为no-cache,在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面;在LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取。
    www.360.com.cn的cache-control为max-age=60,在两种模式下都使用本地缓存数据。


    总结:根据以上两种模式,建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK。


    设置WebView 缓存模式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    private void initWebView() { 
               
            mWebView.getSettings().setJavaScriptEnabled(true); 
            mWebView.getSettings().setRenderPriority(RenderPriority.HIGH); 
            mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);  //设置 缓存模式 
            // 开启 DOM storage API 功能 
            mWebView.getSettings().setDomStorageEnabled(true); 
            //开启 database storage API 功能 
            mWebView.getSettings().setDatabaseEnabled(true);  
            String cacheDirPath = getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME; 
    //      String cacheDirPath = getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME; 
            Log.i(TAG, "cacheDirPath="+cacheDirPath); 
            //设置数据库缓存路径 
            mWebView.getSettings().setDatabasePath(cacheDirPath); 
            //设置  Application Caches 缓存目录 
            mWebView.getSettings().setAppCachePath(cacheDirPath); 
            //开启 Application Caches 功能 
            mWebView.getSettings().setAppCacheEnabled(true); 
        }



    清除缓存

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    /**
         * 清除WebView缓存
         */ 
        public void clearWebViewCache(){ 
               
            //清理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); 
            
        }


    完整代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    package com.example.webviewtest; 
       
    import java.io.File; 
       
    import android.app.Activity; 
    import android.graphics.Bitmap; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.webkit.JsPromptResult; 
    import android.webkit.JsResult; 
    import android.webkit.WebChromeClient; 
    import android.webkit.WebSettings; 
    import android.webkit.WebSettings.RenderPriority; 
    import android.webkit.WebView; 
    import android.webkit.WebViewClient; 
    import android.widget.RelativeLayout; 
    import android.widget.TextView; 
    import android.widget.Toast; 
       
    public class MainActivity extends Activity { 
       
        private static final String TAG = MainActivity.class.getSimpleName(); 
        private static final String APP_CACAHE_DIRNAME = "/webcache"
        private TextView tv_topbar_title; 
        private RelativeLayout rl_loading; 
        private WebView mWebView; 
        private String url; 
       
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.activity_main); 
               
            //url:http://m.dianhua.cn/detail/31ccb426119d3c9eaa794df686c58636121d38bc?apikey=jFaWGVHdFVhekZYWTBWV1ZHSkZOVlJWY&app=com.yulore.yellowsdk_ios&uid=355136051337627 
            url = "http://m.dianhua.cn/detail/31ccb426119d3c9eaa794df686c58636121d38bc?apikey=jFaWGVHdFVhekZYWTBWV1ZHSkZOVlJWY&app=com.yulore.yellowsdk_ios&uid=355136051337627"
            findView(); 
        
       
        private void findView() { 
               
            tv_topbar_title = (TextView) findViewById(R.id.tv_topbar_title); 
               
            rl_loading = (RelativeLayout) findViewById(R.id.rl_loading); 
               
            mWebView = (WebView) findViewById(R.id.mWebView); 
               
            initWebView(); 
               
            mWebView.setWebViewClient(new WebViewClient() { 
       
                @Override 
                public void onLoadResource(WebView view, String url) { 
                       
                    Log.i(TAG, "onLoadResource url="+url); 
                       
                    super.onLoadResource(view, url); 
                
       
                @Override 
                public boolean shouldOverrideUrlLoading(WebView webview, String url) { 
       
                    Log.i(TAG, "intercept url="+url); 
                       
                    webview.loadUrl(url); 
       
                    return true
                
       
                @Override 
                public void onPageStarted(WebView view, String url, Bitmap favicon) { 
                       
                    Log.e(TAG, "onPageStarted"); 
                       
                    rl_loading.setVisibility(View.VISIBLE); // 显示加载界面 
                
       
                @Override 
                public void onPageFinished(WebView view, String url) { 
       
                    String title = view.getTitle(); 
       
                    Log.e(TAG, "onPageFinished WebView title=" + title); 
       
                    tv_topbar_title.setText(title); 
                    tv_topbar_title.setVisibility(View.VISIBLE); 
       
                    rl_loading.setVisibility(View.GONE); // 隐藏加载界面 
                
       
                @Override 
                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
       
                    rl_loading.setVisibility(View.GONE); // 隐藏加载界面 
       
                    Toast.makeText(getApplicationContext(), ""
                            Toast.LENGTH_LONG).show(); 
                
            }); 
       
            mWebView.setWebChromeClient(new WebChromeClient() { 
       
                @Override 
                public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
       
                    Log.e(TAG, "onJsAlert " + message); 
       
                    Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); 
       
                    result.confirm(); 
       
                    return true
                
       
                @Override 
                public boolean onJsConfirm(WebView view, String url, String message, JsResult result) { 
       
                    Log.e(TAG, "onJsConfirm " + message); 
       
                    return super.onJsConfirm(view, url, message, result); 
                
       
                @Override 
                public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { 
       
                    Log.e(TAG, "onJsPrompt " + url); 
       
                    return super.onJsPrompt(view, url, message, defaultValue, result); 
                
            }); 
               
            mWebView.loadUrl(url); 
        
       
        private void initWebView() { 
               
            mWebView.getSettings().setJavaScriptEnabled(true); 
            mWebView.getSettings().setRenderPriority(RenderPriority.HIGH); 
            mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);  //设置 缓存模式 
            // 开启 DOM storage API 功能 
            mWebView.getSettings().setDomStorageEnabled(true); 
            //开启 database storage API 功能 
            mWebView.getSettings().setDatabaseEnabled(true);  
            String cacheDirPath = getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME; 
    //      String cacheDirPath = getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME; 
            Log.i(TAG, "cacheDirPath="+cacheDirPath); 
            //设置数据库缓存路径 
            mWebView.getSettings().setDatabasePath(cacheDirPath); 
            //设置  Application Caches 缓存目录 
            mWebView.getSettings().setAppCachePath(cacheDirPath); 
            //开启 Application Caches 功能 
            mWebView.getSettings().setAppCacheEnabled(true); 
        
           
        /**
         * 清除WebView缓存
         */ 
        public void clearWebViewCache(){ 
               
            //清理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); 
            
        
           
        /**
         * 递归删除 文件/文件夹
         
         * @param file
         */ 
        public void deleteFile(File file) { 
       
            Log.i(TAG, "delete file path=" + file.getAbsolutePath()); 
               
            if (file.exists()) { 
                if (file.isFile()) { 
                    file.delete(); 
                else if (file.isDirectory()) { 
                    File files[] = file.listFiles(); 
                    for (int i = 0; i < files.length; i++) { 
                        deleteFile(files[i]); 
                    
                
                file.delete(); 
            else
                Log.e(TAG, "delete file no exists " + file.getAbsolutePath()); 
            
        
       
    }


     





  • 相关阅读:
    pom.xml
    mongo 根据时间范围查找
    nodejs. cron风,定时任务时间写法
    Linux操作命令(一)
    WPF的ScrollViewer鼠标的滚动
    WPF中Expander控件样式,ListBox的样式(带checkbox)恢复
    CentOS7 安装RabbitMQ
    maven项目中配置jdk1.8插件
    赋予其他用户远程连接自己数据库的权限
    递归获取XML文件中的所有节点
  • 原文地址:https://www.cnblogs.com/yilongm/p/4742733.html
Copyright © 2011-2022 走看看