本文最后更新于 872 天前,其中的信息可能已经有所发展或是发生改变。
- MutableContextWrapper 可以初始预加载使用其他Context,真正使用传入对应的Activity的context
WebSettings webSettings = myWebView.getSettings();
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setDomStorageEnabled(true);
webSettings.setDatabaseEnabled(true);
final String dbPath = getApplicationContext().getDir("db", Context.MODE_PRIVATE).getPath();
webSettings.setDatabasePath(dbPath);
webSettings.setAppCacheEnabled(true);
final String cachePath = getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();
webSettings.setAppCachePath(cachePath);
webSettings.setAppCacheMaxSize(5*1024*1024);
webSettings.setJavaScriptEnabled(true);
public class PreloadWebView {
private PreloadWebView(){}
private static final int CACHED_WEBVIEW_MAX_NUM = 2;
private static final Stack<WebView> mCachedWebViewStack = new Stack<>();
public static PreloadWebView getInstance(){
return Holder.INSTANCE;
}
private static class Holder{
private static final PreloadWebView INSTANCE = new PreloadWebView();
}
/**
* 创建WebView实例
* 用了applicationContext
*/
public void preload() {
L.d("webview preload");
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle() {
if (mCachedWebViewStack.size() < CACHED_WEBVIEW_MAX_NUM) {
mCachedWebViewStack.push(createWebView());
}
return false;
}
});
}
private WebView createWebView() {
WebView webview = new WebView(new MutableContextWrapper(App.getApp()));
webview.getSettings().setJavaScriptEnabled(true);
webview.loadDataWithBaseURL("file:///android_asset/article/?item_id=0&token=0",getHtml(),"text/html","utf-8","file:///android_asset/article/?item_id=0&token=0");
return webview;
}
private static String getHtml() {
StringBuilder builder = new StringBuilder();
builder.append("<!DOCTYPE html>
");
builder.append("<html>
");
builder.append("<head>
");
builder.append("<meta charset="utf-8">
");
builder.append("<meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
");
builder.append("<link rel="stylesheet" type="text/css" href="");
builder.append("file:///android_asset/article/css/android.css");
builder.append("">
</head>
");
builder.append("<body class="font_m"><header></header><article></article><footer></footer>");
builder.append("<script type="text/javascript" src="");
builder.append("file:///android_asset/article/js/lib.js");
builder.append(""></script>");
builder.append("<script type="text/javascript" src="");
builder.append("file:///android_asset/article/js/android.js");
builder.append("" ></script>
");
builder.append("</body>
");
builder.append("</html>
");
return builder.toString();
}
/**
* 从缓存池中获取合适的WebView
*
* @param context activity context
* @return WebView
*/
public WebView getWebView(Context context) {
// 为空,直接返回新实例
if (mCachedWebViewStack == null || mCachedWebViewStack.isEmpty()) {
WebView web = createWebView();
MutableContextWrapper contextWrapper = (MutableContextWrapper) web.getContext();
contextWrapper.setBaseContext(context);
return web;
}
WebView webView = mCachedWebViewStack.pop();
// webView不为空,则开始使用预创建的WebView,并且替换Context
MutableContextWrapper contextWrapper = (MutableContextWrapper) webView.getContext();
contextWrapper.setBaseContext(context);
return webView;
}
}