WebView書き込みデータはlocal Strageでまとめます.
7894 ワード
最近のプロジェクトではHyboridのフレームワークを使って、JSBridgeを通じてWebViewとJavaScriptの通信を構築しましたが、フロントエンドによると、送受信が煩雑だと言われています.もう一つのlocastrageの方法はとても簡単です.私はもう一つの方法をマスターしたので、なぜ他の方法を勉強しないのですか?簡単に見に行きました.次の方法があります.
教えてもらって、その理由は以下の通りです.
最初から書き込みデータをlocal Strageに保存する操作を実行しましたが、その時はまだページがレンダリングされていません.実行中のjsは宿主が見つからないため、データの書き込みに失敗しました.
では、いつ記入すればいいですか?まず思いついたのはハードラーの遅延実行方法でデータを書き込むことですが、遅延時間はどれぐらいがいいですか?答えはWebViewから探さなければなりません.
上の方法はほぼすべて大神が共有したもので、主に自分はWebViewに慣れていないので、最初はデータを書き込んでlocastrageに行くという方法が失効したと思っていましたが、後に自分で操作する姿勢が間違っていると信じています.local Storrageの書き込みに遅延が必要だと知っていても、WebView Clientに関する方法は思いつかなかったです.これらの方法は全部ネットで見たのですが、自分はこれらの方法を使ったことがないので、必要な時には意識できませんでした.だから記録を作って、後で自分で時間があっても多く見に来てもいいです.
参考記事:
http://blog.csdn.net/u011240877/article/details/52839845 http://blog.csdn.net/qq_1655995/articale/detail/51376371
//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