将WebView彻底销毁的问题
在写一个VideoView播放视频时,发现跳转到webView播放完h5加载的video标签的视频后finish再跳转回来,VideoView再播放视频时会出现此视频无法播放,而且我以前加载的动画也会很卡,所以我怀疑是webView还占内存的原因,所以我决定销毁WebView,但是尝试了很多方法。
方法一: 设置setting的缓存及WebView再finish时清除缓存及本地文件,但是没用。
private static final String APP_CACAHE_DIRNAME = "/webcache";
//设置webView缓存功能 public void setCache(WebSettings settings){ settings.setCacheMode(WebSettings.LOAD_NO_CACHE); //设置 缓存模式 // 开启 DOM storage API 功能 settings.setDomStorageEnabled(true); //开启 database storage API 功能 settings.setDatabaseEnabled(true); String cacheDirPath = getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME;// String cacheDirPath = getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME; //设置数据库缓存路径 settings.setDatabasePath(cacheDirPath); //设置 Application Caches 缓存目录 settings.setAppCachePath(cacheDirPath); //开启 Application Caches 功能 settings.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); File webviewCacheDir = new File(getCacheDir().getAbsolutePath()+"/webviewCache"); //删除webview 缓存目录 if(webviewCacheDir.exists()){ deleteFile(webviewCacheDir); } //删除webview 缓存 缓存目录 if(appCacheDir.exists()){ deleteFile(appCacheDir); } } /** * 递归删除 文件/文件夹 * * @param file */ public void deleteFile(File file) { 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("WebView", "delete file no exists " + file.getAbsolutePath()); } }
重写finish()方法清除
@Override public void finish() { clearWebViewCache(); super.finish(); }
方法二 :还是重写finish(),在里面清除cookie和session,然后webview=null,还是没用
//清除cookieCookieManager.getInstance().removeAllCookie(); CookieManager.getInstance().removeSessionCookie();
方法三:在Activity的布局中加入一个FrameLayout布局,然后将WebView动态加载进去,然后重写onDestroy(),再将FrameLayout里的View全部移除,上面的代码我也重写到onDestroy()中
@Override protected void onDestroy() { //清除WebView缓存 clearWebViewCache(); //清除cookie CookieManager.getInstance().removeAllCookie(); CookieManager.getInstance().removeSessionCookie(); //fm_webview指FrameLayout fm_webview.removeView(questWvQuest); //questWvQuest指webView questWvQuest.destroy(); questWvQuest=null; super.onDestroy(); }
这里还有一位大牛的博客,大家可以参考一下,说不定有帮助http://blog.csdn.net/qq_16318981/article/details/45362399
WebVIew无法加载天猫网页的问题
只要需要重写这个方法就行,但是一定要注意,不要重写shouldOverrideUrlLoading();这个方法
questWvQuest.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { WebResourceResponse response = super.shouldInterceptRequest(view, url); if(url != null && url.contains(INJECTION_TOKEN)) { String assetPath = url.substring(url.indexOf(INJECTION_TOKEN) + INJECTION_TOKEN.length(), url.length()); try { response = new WebResourceResponse( "application/javascript", "UTF8", RequestActivity.this.getAssets().open(assetPath) ); } catch (IOException e) { e.printStackTrace(); // Failed to load asset file } } return response; }
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦