Android WebView首次页面加载完成后无法读取LocalStorage数据
Android WebView首次加载读取LocalStorage返回null的解决办法
问题原因
onPageFinished触发仅代表页面DOM加载完成,但如果页面的LocalStorage数据是通过异步逻辑(比如接口请求后)写入的,此时执行localStorage.getItem会因数据未初始化而返回null。
具体解决办法
1. 延迟执行读取逻辑
给页面预留足够的时间完成LocalStorage数据初始化,通过延迟调用读取方法:
@Override public void onPageFinished(WebView view, String url) { // 延迟500ms执行,可根据实际页面逻辑调整时长 new Handler(Looper.getMainLooper()).postDelayed(() -> { getLocalStorageAndSaveOnAndroidPref("androidDeliveryAppStickyNotificationTitle", view); }, 500); }
2. 让网页主动通知Native层(最可靠)
当网页端完成LocalStorage数据写入后,主动调用Native方法传递数据:
- 第一步:给WebView注册JavaScript接口
// WebView初始化时配置 WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webView.addJavascriptInterface(new LocalStorageCallback(), "LocalStorageCallback"); // 定义回调类 class LocalStorageCallback { @JavascriptInterface public void onLocalStorageReady(String key, String value) { Log.d(TAG, "onLocalStorageReady: " + key + " = " + value); SharePref.setDataPref(key, value); } }
- 第二步:网页端在数据写入后触发通知
// 网页中完成LocalStorage写入后执行 localStorage.setItem('androidDeliveryAppStickyNotificationTitle', '目标内容'); // 通知Native层 if (window.LocalStorageCallback) { window.LocalStorageCallback.onLocalStorageReady( 'androidDeliveryAppStickyNotificationTitle', localStorage.getItem('androidDeliveryAppStickyNotificationTitle') ); }
3. 检查WebView基础配置
确保WebView开启了LocalStorage依赖的相关权限:
WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); // 必须开启,LocalStorage依赖DOM存储 webSettings.setDatabaseEnabled(true); // 适配部分低版本Android系统
4. 验证网页端数据是否存在
通过Chrome的chrome://inspect连接设备,查看WebView的开发者工具,手动执行localStorage.getItem('androidDeliveryAppStickyNotificationTitle'),确认网页本身是否在首次加载后确实写入了数据。
内容的提问来源于stack exchange,提问作者Manish
相关产品推荐
相关产品推荐

