最近公司要混合开发,有部分网页是需要做缓存的,设置缓存比较简单,有五种缓存策略,具体下面demo都有注释,不过在清除缓存的时候确实踩了坑,网上找一堆得解决方案都无效,而且十篇文章有九篇都类似,可想而知某搜索引擎水分有多足。
重点看清除缓存clearWebViewCache()方法,通过removeSessionCookie(); removeAllCookie(); 这两个方法去清楚webview的缓存,以下代码是我写得一个demo大家可以参考一下:
Java代码:
package com.example.chan.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button mButtonBack; // 返回
private TextView mTextViewTitle; // 标题栏
private Button mButtonRefresh; // 刷新
private WebView mWebView; // webview
private Button mBtnJump; //跳转
private boolean needClearHistory = false; // 是否webview清除记录
private static final String TAG = MainActivity.class.getSimpleName(); //标识
private static final String APP_CACAHE_DIRNAME = "/webcache"; //WebView缓存目录
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
initCacheMode();
initWebView();
}
private void initUI() {
// 控件绑定
mWebView = (WebView) this.findViewById(R.id.webview);
mTextViewTitle = (TextView) this.findViewById(R.id.tv_title);
mButtonBack = (Button) this.findViewById(R.id.btn_back);
mButtonRefresh = (Button) this.findViewById(R.id.btn_refresh);
mBtnJump = (Button) this.findViewById(R.id.btn_jump);
// 点击监听
mButtonBack.setOnClickListener(new myListeren());
mButtonRefresh.setOnClickListener(new myListeren());
mBtnJump.setOnClickListener(new myListeren());
}
private void initCacheMode() {
/**
* 初始化缓存策略
* 缓存策略(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,都使用缓存中的数据。
*/
/*------------------- WebView cache start ------------------*/
mWebView.getSettings().setJavaScriptEnabled(true); //是否支持js
mWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); //提高渲染的优先级
mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //设置 缓存模式
// 开启 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 cache end ------------------*/
}
private void initWebView() {
/*------------------- WebView setting start ------------------*/
// 设置webview标题
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
mTextViewTitle.setText(title);
super.onReceivedTitle(view, title);
}
});
mWebView.setWebViewClient(new WebViewClient() {
// 重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
// view.loadUrl(request.getUrl().toString());
return false;
}
// 网络连接异常时 调用该方法
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (needClearHistory) {
needClearHistory = false;
// 清除历史记录
mWebView.clearHistory();
}
}
});
/*------------------- WebView setting end ------------------*/
mWebView.loadUrl("http://www.sogou.com/");
}
/**
* 清除WebView缓存
*/
public void clearWebViewCache() {
//清空所有Cookie
CookieManager cm = CookieManager.getInstance();
cm.removeSessionCookie();
cm.removeAllCookie();
}
// 按返回键时, 不退出程序而是返回上一浏览页面
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
// 监听类
class myListeren implements View.OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_back: // 返回
// if (mWebView.canGoBack()) {
// mWebView.goBack();
// } else {
// onBackPressed();
// }
clearWebViewCache();
Toast.makeText(MainActivity.this, "返回", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_refresh: // 刷新
mWebView.reload();
Toast.makeText(MainActivity.this, "刷新", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_jump: // 跳转
needClearHistory = true;
mWebView.loadUrl("http://www.hao123.com");
// 不合理的解决方案
// mWebView.postDelayed(new Runnable() {
// @Override
// public void run() {
// mWebView.clearHistory();
// }
// }, 1000);
Toast.makeText(MainActivity.this, "跳转", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
}
页面代码:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.chan.myapplication.MainActivity">
<LinearLayout
android:id="@+id/ll_title_bar"
android:layout_width="match_parent"
android:layout_height="40dip"
android:background="@android:color/black"
android:orientation="horizontal">
<Button
android:id="@+id/btn_back"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="返回"/>
<Button
android:id="@+id/btn_jump"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="跳转"/>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="Title"
android:textColor="@android:color/white"/>
<Button
android:id="@+id/btn_refresh"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="刷新"/>
LinearLayout>
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/ll_title_bar"/>
RelativeLayout>