WebView書き込みデータはlocal Strageでまとめます.


最近のプロジェクトではHyboridのフレームワークを使って、JSBridgeを通じてWebViewとJavaScriptの通信を構築しましたが、フロントエンドによると、送受信が煩雑だと言われています.もう一つのlocastrageの方法はとても簡単です.私はもう一つの方法をマスターしたので、なぜ他の方法を勉強しないのですか?簡単に見に行きました.次の方法があります.
//1.   JavaScript   
String key= "userInfo";
User user = new User();
user.setName("Vicent");
user.setPhone(18888886666);
String value = new Gson().toJson();
String js = "window.localStorage.setItem("+key+",'" + value + "');";
String jsUrl = "javascript:(function({
    var localStorage = window.localStorage;
    localStorage.setItem("+key+",'" + value + "')
})()";

//2.      ,      API    Js
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    mWebView.evaluateJavascript(js, null);
} else {
    mWebView.loadUrl(jsUrl);
    mWebView.reload();
}
理解した結果、setItem方法はMapオブジェクトと似ています.key-valueキーで記憶しています.このvalueを取り出す方法は以下の通りです.
window.localStorage.getItem('userInfo')
もちろん、値を取るのは心配しなくてもいいです.先端はかなり熟練しています.直接使いますか?いいえ、少なくともWebViewにいくつかの関数を設定する必要があります.
mWebView = (WebView) this.findViewById(R.id.webview);  

WebSettings settings = mWebView.getSettings();  
settings.setJavaScriptEnabled(true);  
//settings.setPluginsEnabled(true);  

/***        JS  **/  
mWebView.getSettings().setDomStorageEnabled(true);  
// Set cache size to 8 mb by default. should be more than enough  
mWebView.getSettings().setAppCacheMaxSize(1024*1024*8);  

// This next one is crazy. It's the DEFAULT location for your app's cache  
// But it didn't work for me without this line.  
// UPDATE: no hardcoded path. Thanks to Kevin Hawkins  
String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();  
mWebView.getSettings().setAppCachePath(appCachePath);  
mWebView.getSettings().setAllowFileAccess(true);  
mWebView.getSettings().setAppCacheEnabled(true);  
こんなにたくさん作って、やっといいですか?これをロードしてから、これまでユーザー情報を表示する必要があるので、mWebView.loadUrl(www.***)の後ですぐに送る必要があります.運行後、nullに値を取り出して、これはどういう状況ですか?どこが違いますか
教えてもらって、その理由は以下の通りです.
最初から書き込みデータをlocal Strageに保存する操作を実行しましたが、その時はまだページがレンダリングされていません.実行中のjsは宿主が見つからないため、データの書き込みに失敗しました.
では、いつ記入すればいいですか?まず思いついたのはハードラーの遅延実行方法でデータを書き込むことですが、遅延時間はどれぐらいがいいですか?答えはWebViewから探さなければなりません.
private boolean inWrited = false;
webView.setWebViewClient(new WebViewClient(){
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        if(!inWrited){
            setData(webView);
            inWrited = true;
        }
    }
});

private void setData(WebView mWebView) {
        //1.   JavaScript   
        String key= "userInfo";
        User user = new User();
        user.setName("Vicent");
        user.setPhone(18888886666);
        String value = new Gson().toJson();
        String js = "window.localStorage.setItem("+key+",'" + value + "');";
        String jsUrl = "javascript:(function({
        var localStorage = window.localStorage;
        localStorage.setItem("+key+",'" + value + "')
    })()";

//2.      ,      API    Js
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        mWebView.evaluateJavascript(js, null);
    } else {
        mWebView.loadUrl(jsUrl);
        mWebView.reload();
    }
    }
以上はWebViewでファイルをロードした後、すぐにlocal Strageにデータを書き込みます.jsファイルはユーザーの情報を設定する時、値を取る時も二度と取れないことはありません!
上の方法はほぼすべて大神が共有したもので、主に自分はWebViewに慣れていないので、最初はデータを書き込んでlocastrageに行くという方法が失効したと思っていましたが、後に自分で操作する姿勢が間違っていると信じています.local Storrageの書き込みに遅延が必要だと知っていても、WebView Clientに関する方法は思いつかなかったです.これらの方法は全部ネットで見たのですが、自分はこれらの方法を使ったことがないので、必要な時には意識できませんでした.だから記録を作って、後で自分で時間があっても多く見に来てもいいです.
参考記事:
http://blog.csdn.net/u011240877/article/details/52839845 http://blog.csdn.net/qq_1655995/articale/detail/51376371