您的位置:首页 > 移动开发

AndroidWebView的销毁和无法加载天猫网页的问题

2016-12-01 10:37 495 查看

将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,还是没用

//清除cookie
CookieManager.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.
af06
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息