2018-01-15,webview的坑

2018-01-15  本文已影响0人  欧阳峰_oyf

1.为什么Webview打开一个页面,播放一段音乐,退出Activity时音乐还在后台播放?

//销毁Webview,解决

@Override

protectedvoidonDestroy(){

   if (mWebview != null) {

       mWebview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);

       mWebview.clearHistory();

       ((ViewGroup) mWebview.getParent()).removeView(mWebview);

       mWebview.destroy();

       mWebview = null;

   }

   super.onDestroy();

}

2.为什么打包之后JS调用失败(或者WebView与JavaScript相互调用时,如果是debug没有配置混淆时,调用时没问题的,但是当设置混淆后发现无法正常调用了)? 

-keepattributes *Annotation*  

-keepattributes *JavascriptInterface*

-keep public classorg.mq.study.webview.DemoJavaScriptInterface{

  public ;

}

#假如是内部类,混淆如下:

-keepattributes *JavascriptInterface*

-keep public classorg.mq.study.webview.webview.DemoJavaScriptInterface$InnerClass{

   public ;

}

3. 5.0 以后的WebView加载的链接为Https开头,但是链接里面的内容,比如图片为Http链接,这时候,图片就会加载不出来,怎么解决?

原因是Android 5.0上Webview默认不允许加载Http与Https混合内容:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

//两者都可以

webSetting.setMixedContentMode(webSetting.getMixedContentMode());

//mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);

}

 参数说明:

MIXED_CONTENT_ALWAYS_ALLOW 允许从任何来源加载内容,即使起源是不安全的;

MIXED_CONTENT_NEVER_ALLOW 不允许Https加载Http的内容,即不允许从安全的起源去加载一个不安全的资源;

MIXED_CONTENT_COMPLTIBILITY_MODE 当涉及到混合式内容时,WebView会尝试去兼容最新Web浏览器的风格;

4. WebView调用手机系统相册来上传图片,开发过程中发现在很多机器上无法正常唤起系统相册来选择图片。怎么解决?

因为Google攻城狮们对setWebChromeClient的回调方法openFileChooser做了多次修改,5.0以下openFileChooser有几种重载方法,在5.0以上将回调方法该为了onShowFileChooser。

http://blog.csdn.net/xiexie758/article/details/52446937

5.WebView 开启硬件加速导致的问题?

WebView开启硬件加速导致屏幕花屏问题的解决:

原因分析:

4.0以上的系统我们开启硬件加速后,WebView渲染页面更加快速,拖动也更加顺滑。但有个副作用就是,当WebView视图被整体遮住一块,然后突然恢复时(比如使用SlideMenu将WebView从侧边滑出来时),这个过渡期会出现白块同时界面闪烁。

 6.ViewPager里非首屏WebView点击事件不响应是什么原因?

如果你的多个WebView是放在ViewPager里一个个加载出来的,那么就会遇到这样的问题。ViewPager首屏WebView的创建是在前台,点击时没有问题;而其他非首屏的WebView是在后台创建,滑动到它后点击页面会出现如下错误日志:

20955-20968/xx.xxx.xxx E/webcoreglue﹕ Shouldnothappen:norect-based-test nodes found

解决方案:

这个问题的办法是继承WebView类,在子类覆盖onTouchEvent方法,填入如下代码:

@Override

publicbooleanonTouchEvent(MotionEvent ev){

if(ev.getAction() == MotionEvent.ACTION_DOWN) {

onScrollChanged(getScrollX(), getScrollY(), getScrollX(), getScrollY());

}

returnsuper.onTouchEvent(ev);

}

关于WebView的一点小优化

加快HTML网页加载完成的速度,等页面finish再加载图片

自定义WebView页面加载出错界面

 怎么知道WebView是否存在滚动条?

怎么知道WebView是否已经滚动到页面底端?

上一篇下一篇

猜你喜欢

热点阅读