如果使用WebChromeClient
时遇到了 深入探究Espresso的Idling Resources 所描述的不可靠问题,考虑改用 WebViewClient
。
我发现当网页加载完成时,WebViewClient
可以可靠地触发 onPageFinished()
。 WebChromeClient
和 WebViewClient
相似,但 WebViewClient
更加通用,因为 WebChromeClient
处理 WebView 的 Chrome 特定方面(请参见 setWebViewClient与setWebChromeClient之间的区别是什么?)。
在一个示例项目中https://github.com/mosofsky/how-to-coredux, 我将 onPageFinished()
函数注册到 WebView
中,如下所示:
playVideoWebView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
return false
}
override fun onPageFinished(view: WebView?, url: String?) {
if (null != url && url != ABOUT_URL) {
howToViewModel.dispatchAction(LoadVideo_Finish)
}
}
}
我希望这对你有所帮助,尽管我承认我没有解决你提到的其他缺点。至于缺少getWebChromeClient()
,现在似乎已经可以使用了。至于需要特定的WebView实例,我不知道如何避免这种情况。不管怎样,当WebView加载完成时,你必须让它减少空闲资源计数器。任何解决方案似乎都必须以某种方式触及特定的WebView实例才能完成此注册过程。一些开发人员可能会觉得在生产代码中添加CountingIdlingResource
的increment()
和decrement()
调用是繁琐或不合适的。
为了最小化使用空闲资源计数调用的代码量,您可以将这些调用隔离到我所谓的异步代码“副作用”中。为此,我发现使用Redux数据存储非常有帮助,例如
CoRedux。当异步操作开始时,您可以将状态更新为“进行中”;当它结束时,清除该“进行中”标志。 “副作用”可以是任何监听“进行中”的机制。CoRedux实际上有一个称为“副作用”的结构,您可以使用它,但任何响应状态更改的机制都可以。
在
how-to-coredux示例项目的副作用中,它像这样调用
increment()
和
decrement()
:
when (action) {
is Initialize_Start, is ShowVideoFragment_Start, LoadVideo_Start, HideVideoFragment_Start -> {
espressoTestIdlingResource.increment()
}
Initialize_Finish, ShowVideoFragment_Finish, LoadVideo_Finish, HideVideoFragment_Finish -> {
espressoTestIdlingResource.decrement()
}
}
通过将空闲资源逻辑隔离到副作用中,整个 Android 项目可以依赖于一段代码来调用increment()
/decrement()
,每当任何异步 UI 事件开始/结束时。
WebView
似乎有一个getWebChromeClient()方法。或许它是在原问题发布之后引入的。 - Michael Osofsky