网站客服:zx81024163 |

Android WebView常见的坑和解决方案

2023-11-15 14:03:39发布    浏览574次    信息编号:83630

友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。

Android WebView常见的坑和解决方案

1. 一些常见的陷阱 1. 内存泄漏

因为是附加的,所以线程的生命周期与启动线程的生命周期不一致,会导致对其的引用被持有而无法释放。 解决方案有以下三种:

解决方案:

(1)独立进程,简单暴力,但可能涉及进程间通信。 即使出现oom crash等问题,也不会影响主程序。

方法:只需在.xml标签中添加:=“.web”即可。

(2)创建

方法:未在 xml 中定义,但在需要时创建,用于传入呼叫。 因为这个可以在()中销毁,可以及时清理内存; 如果你创建了需要替代使用的东西,那么当它被销毁时,该对象将不再被占用;

LinearLayout mLayout = (LinearLayout) findViewById(R.id.layout);   
WebView mWebView = new WebView(getApplicationContext()); 
LinearLayout.LayoutParams params = new  LinearLayout.LayoutParams
    (ViewGroup.LayoutParams.MATCH_PARENT,  ViewGroup.LayoutParams.MATCH_PARENT);
mWebView.setLayoutParams(params); 
mLayout.addView(mWebView);

(3) 销毁

方法:销毁时需要放入()中:先加载空内容,然后移除,然后放入.(),最后留空。

@Override 
protected void onDestroy() {  
    if (mWebView != null) {
        mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null); 
        mWebView.clearHistory(); 
        mLayout.removeView(mWebView); 
         mWebView.destroy(); 
         mWebView = null; 
    } 
        super.onDestroy(); 
}

2..()问题

调用该方法时无法判断网页内容是否真正加载。 当前加载的网页跳转时可能会多次调用该方法。 大多数开发人员都会参考有关如何监听已完成的加载 URL 的高票答案,但其中列出的解决方案并不完美。 。

解决方案:

当你需要加载各种网页并且需要在页面加载时执行一些操作时,.()可能比.()更可靠。

3、后台功耗问题

当加载页面时,会自动启动线程进行加载。 如果它们没有被正确销毁,这些剩余的线程将始终在后台运行,导致应用程序的功耗保持较高水平。

解决方案:

可以使用暴力破解的方法,即在.()中直接调用.exit(0),将应用程序彻底从虚拟机中删除。

在有些手机中,如果加载的HTML中有一些js一直在执行动画之类的东西,如果此刻挂在后台,这些资源不会被释放,用户也察觉不到,导致CPU占用和功耗不断。 极快。

解决方案:

放 (); in 和 分别为 false 和 true。

4. 相互调用的问题

如果debug没有配置混淆,调用时没有问题,但是设置混淆后,发现无法正常调用。

解决方案:

在proguard-rules.pro中添加混淆。
-keepattributes *Annotation*  
-keepattributes *JavascriptInterface*
-keep public class xx.xxx.ShowLogJavaScriptInterface{
   public ;
}
其中xx.xxx..ShowLogJavaScriptInterface 是不需要混淆的类

5、图片加载失败

.0之后加载的链接以Https开头,但链接中的内容(例如图片)是Http链接。 此时,图片将不会被加载。 因为.0默认不允许加载混合HTTP和HTTPS内容:

**解决方案:**
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    //mWebView.getSettings().setMixedContentMode(
                            WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
参数说明:
MIXED_CONTENT_ALWAYS_ALLOW 允许从任何来源加载内容,即使起源是不安全的;
MIXED_CONTENT_NEVER_ALLOW不允许Https加载Http的内容,即不允许从安全的起源去加载一个不安全的资源;
MIXED_CONTENT_COMPLTIBILITY_MODE当涉及到混合式内容时,WebView会尝试去兼容新Web浏览器的风格;

6、开启硬件加速导致切换画面闪烁问题

从3.0(API)开始,绘制View时支持硬件加速,充分利用GPU的特性,使绘制更加流畅,但会消耗更多的内存。 开启硬件加速后,页面渲染速度更快,拖动更流畅。 但有一个副作用是,当视图完全被覆盖然后突然恢复时(例如用户从侧面滑出时),过渡期间会出现白色块,界面会闪烁。 而且,如果你在同一个不同的页面(包含不同的网页内容)之间来回切换,你会发现溅屏是不可避免的。 这应该是硬件加速的bug。 如果关闭硬件加速,情况会好很多,但你将无法获得良好的浏览体验。 滑动的时候你会感觉网页一个接一个卡住。

解决方案:

在过渡期之前暂时关闭硬件加速,并在过渡期之后将其打开。

硬件加速分为四个级别:
Application级别
     "true"...>
Activity级别
     "true"...>
window级别(目前为止,Android还不支持在Window级别关闭硬件加速。)
    getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
        WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
View级别
     view.setLayerType(View.LAYER_TYPE_HARDWARE, null);

//过度前关闭硬件加速
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB){
    mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

//过度后开启硬件加速
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB){
    mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}

7. 视频播放

在有些手机上,当有视频时,视频资源销毁后并没有被销毁,甚至可以听到后台播放的声音。

解决方案:

之前把url改成空地址。

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

2. 总结

提醒:请联系我时一定说明是从星空网上看到的!