Android-MutableContextWrapper和IdleHandler
本文最后更新于 653 天前
  • 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;
    }


}
iichen:https://iichen.cn/?p=491
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇