Kotlin使用agentweb引起WebView的onPageStarted中favicon为空导致崩溃
-
场景:
kotlin开发环境,使用AgentWeb,在WebActivity的onCreate中,AgentWeb初始配置如下
//初始化AgentWeb对象 mAgentWeb = AgentWeb.with(this) .setAgentWebParent( mLinearLayout, LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) ) .useDefaultIndicator() .setWebChromeClient(mWebChromeClient) .setWebViewClient(mWebViewClient)//注意这里!!!!!!!! .setMainFrameErrorView(R.layout.agentweb_error_page, -1) .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK) .setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.ASK)//打开其他应用时,弹窗咨询用户是否前往其他应用 .interceptUnkownUrl() //拦截找不到相关页面的Scheme .createAgentWeb() .ready() .go("http://www.google.com") -
问题
打开
WebActivity会直接崩溃,错误日志如下java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter favicon at com.zhiwei.services.webapp.BaseWebActivity$mWebViewClient$1.onPageStarted(Unknown Source:12) at com.just.agentweb.WebViewClientDelegate.onPageStarted(WebViewClientDelegate.java:80) at com.just.agentweb.DefaultWebClient.onPageStarted(DefaultWebClient.java:466) at xq.b(SourceFile:219) at alW.handleMessage(SourceFile:20) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193)问题清晰描述为在
onPagestarted函数中favicon字段为空,kotlin本身调用时候认为为非空的数据,现在为空,所以引起崩溃。 -
解决方案
-
如不需要特殊处理,可以移除
setWebViewClient这个初始化配置 -
若需要使用
setWebViewClient,则需要同时设置一个useMiddlewareWebClient.setWEbViewClient(mWebViewClient) .useMiddlewareWebClient(object:MiddlewareWebClientBase(){ //可以抽取出去,定义一个实现类也行,这里使用了匿名内部类 override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { //定义一个bitmap,避免favicon为空,引起的崩溃 val ff = favicon ?: ImageUtils.drawable2Bitmap(AppUtils.getAppIcon()) super.onPageStarted(view, url, ff) } }) -
修改源码
DefaultWebClient@Override public void onPageStarted(WebView view, String url, Bitmap favicon) { //在这里处理favicon为空,defaultWebClient内部有Activity的弱引用 //可以取Activity获取到resource,来构建一个bitmap给faicon, //或者WebIconDatabase.getInstance().open(getDir("icons", MODE_PRIVATE).getPath());设置web的图标 if (!mWaittingFinishSet.contains(url)) { mWaittingFinishSet.add(url); } super.onPageStarted(view, url, favicon); }
-
-
原因分析:kotlin语言中若未声明
bitmap:Bitmap?为可null类型,则断定就是非空,所以如果传递的值,是null值,就会崩溃。类似Java中@NonNull标记,而AgentWeb的DefaultWebClient、WebViewClientdelegate的onPageStarted函数,都是java文件,里面未做favicon的非空判断。(似乎就是android webview的问题)
综合建议:还是希望作者可以处理一下favicon的null问题,便于更多的其他开发者使用kotlin开发时候,减少这个麻烦的处理。
碰到相同问题
点赞。
v4.1.2的还是挂了
估计是作者并没有修改这个Bug,你可以参照上面的描述,自己处理一下。
v4.1.2的还是挂了
估计是作者并没有修改这个Bug,你可以参照上面的描述,自己处理一下。
按照你们讲的设置了useMiddlewareWebClient还是挂了,你是v4.1.2的吗?
我这边用的也是4.1.2的,你设置useMiddlewareWebClient在onPageStarted中定义bitmap了么,避免favicon为空
.useMiddlewareWebClient(object : MiddlewareWebClientBase() { override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { val ff = favicon?: activity?.getMyDrawable(R.drawable.ic_launcher_wx_share)?.toBitmap() super.onPageStarted(view, url, ff) } })
val ff = favicon?: activity?.getMyDrawable(R.drawable.ic_launcher_wx_share)?.toBitmap()你这后版本也就是:之后的部分,可能获取的bitmap也是null。所以保持ff必须非空,才可以调用下面的super
喔喔
我用 方法2 还是同样的报错 用方法1就没问题
不用搞那么复杂啊 ,直接在favicon 参数后面加个问号就行