Android WebView白屏解决方案

项目中   加载webview网页 偶尔链接会白屏  先说一下解决方案

解决方案三种:

1、mWebView.getSettings().setDomStorageEnabled(true);

2、mWebView.getSettings().setPluginState(WebSettings.PluginState.ON);//设置是否支持插件

3、还有可能和缓存有关系  可以设置清理一下缓存

webView默认是不开启DOM Storage的,需要手动调用setDomStorageEnabled(true)来开启,只有开启了DOM Storage api后页面才能正常缓存一些数据

有可能是h5用了插件 要设置一下

什么是DOM Storage

HTML5 是下一代 HTML 标准,开始吸引越来越多人的目光。HTML5 的 DOM Storage 机制提供了一种方式让程序员能够把信息存储到本地的计算机上,在需要时获取。这点和 cookie 相似,区别是 DOM Storage 提供了更大容量的存储空间。 
DOM Storage 分为 sessionStorage 和 localStorage。 
localStorage 对象和 sessionStorage 对象使用方法基本相同,它们的区别在于作用的范围不同。sessionStorage 用来存储与页面相关的数据,它在页面关闭后无法使用。而 localStorage 则持久存在,在页面关闭后也可以使用。

webview一些必要设置的属性

        //设置支持js
        webSettings.setJavaScriptEnabled(true);
        //设置适应屏幕
        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
        webSettings.setPluginState(WebSettings.PluginState.ON);//设置是否支持插件
        webSettings.setSupportZoom(true); //支持缩放
        webSettings.setBuiltInZoomControls(true);
        webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
        //设置存储模式
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        webSettings.setAllowFileAccess(true);
        //setDomStorageEnabled解决了webview白屏问题  设置支持DomStorage
        webSettings.setDomStorageEnabled(true);
        //设置支持本地存储
        webSettings.setDatabaseEnabled(true);
        //设置缓存
        webSettings.setAppCacheEnabled(true);
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
        webSettings.setDefaultTextEncodingName("utf-8");


        //下面三个各种监听
        mWebView.setWebChromeClient(wcc);
        mWebView.setDownloadListener(dl);
        mWebView.setWebViewClient(wvc);
        //加载连接
        mWebView.loadUrl(XXXXXXXX);

Android  WebView与h5的js方法交互:

1、设置支持js

webSettings.setJavaScriptEnabled(true);

2、注入 Java 对象到 WebView 中

binding.webView.addJavascriptInterface(getJavascriptObject(), "bridge");

注:Java 对象定义如下,需要特别注意的是,在 JELLY_BEAN_MR1 之后,只有 public 且添加了 @JavascriptInterface注解的方法才能被调用
private JavascriptObject getJavascriptObject(){
        return new JavascriptObject();
}

public class JavascriptObject{

        @JavascriptInterface
        public final void showTitleBar(){
            binding.webView.post((Runnable)(() -> {
                binding.rlHeaderView.getRoot().setVisibility(View.VISIBLE);
            }));
        }

        @JavascriptInterface
        public final void getCurrentLocation(@NotNull final String jsCallback) {
            binding.webView.post((Runnable)((Runnable) () -> {
                CharSequence var1 = (CharSequence)jsCallback;
                if (var1 != null && var1.length() != 0) {
                    binding.webView.loadUrl("javascript:window." + jsCallback);
                }
            }));
        }
}
 getCurrentLocation方法就是h5调用客户端的方法,jsCallback是客户端给h5的回调方法

你可能感兴趣的:(webview,android)