风起
接到反馈,说是之前一个老项目的详情页(html)长按不能复制了(华为mate9),uh…不记得需求里有长按复制功能,不过现在原生webview是支持长按复制的,所以就是个默认需求了,那这个bug是要改的。
拿手边的华为和小米试了一下,的确不能复制,然后到模拟器上跑了下,uh…长按可以复制。好吧,明确为适配问题。
云涌
适配问题也分两种,毕竟有前端童鞋参与吧。那就先确定谁的适配问题。
模拟器能复制,真机的项目中不能复制,那真机自带的浏览器呢,copy了Url到真机浏览器上跑了下,可以复制啊,说明这个web页在通用页面上是可以复制的。那就是说,咱的webview有问题呗。。尴尬,webview这块挺容易出问题的,好吧,那就逮住 setting,Webclient,WebChromeClient这几个关键项来逐个排查呗。。
沧桑
然而,在尝试多次,搜索多次后,无奈发现,不能复制就是不能复制。。小样,跟我杠上了,这时候就想,会不会是项目主题或者Style影响了呢,毕竟长按复制有个小弹窗啊,还是可能会受这些影响的。
于是乎,项目中各种Theme和Style看啊,试啊,结果,要复制,是不行的。
这回快服了,灵机一动,来吧,开个demo,弄个最简单的webview加载一下那个url(代码如下),纳尼。。长按可以复制,悲剧了,华为真机一个最普通的webview打开都没有问题啊,还是项目中某个东东影响了结果。
唉,会是啥呢,在项目中写了个最简单的demo页面,仍是下面这个
class MainActivity : AppCompatActivity() {
@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
webView.settings.javaScriptEnabled = true
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
view?.loadUrl(request?.url.toString())
return true
}
}
webView.loadUrl("https://blog.csdn.net/cysion1989/article/details/73431003")
}
}
然后,替换进入出问题的详情页面(页面X),即由原来的页面A->页面X;变成了现在的页面A -> Demo页面,,然而,不能复制就是不能复制。。
柳暗
看来肯定是项目某个地方影响了,主题,样式或者其它全局配置吗?
这样,把Demo页面改成了Launcher页面,打开就进来,发现能复制。看来这些都不影响啊。那么一定是某处代码有问题,冥冥中影响了呗。这时候把页面A的前页面P找出来,把原来的页面P->页面A改成了页面P->Demo页面,发现,能复制了。。
问题总算定位差不多了,原来是页面A中某个代码不老实,影响了webview,可是看着页面A的代码也挺老实啊,代码都跟WebView没关系。
入定
好吧,服了,采用注释大法,一层一层的注释,然后重新运行,终于让我逮到了那个奇葩的家伙。。
原项目中为了在页面A做个轮播,使用了AsyncTask(老项目嘛),这个Task为了无限运行,自然会在其doInBackground开个无限循环,当我注释掉这个循环的时候,这篇博客就出来了。。能复制的终归能复制了!!
花明
AsyncTask里做无限循环任务,只要循环没有结束,华为的Webview就不能长按复制。。可能还有小米~有下面代码为证,有兴趣的可以试试。
模拟器没问题,说明官方底层代码是没有问题的,华为出现了,这个锅也只能他们背了,具体他们改了啥,或许以后有机会能知道吧。。
知道了问题所在,自然就好解决了。
class MainActivity : AppCompatActivity() {
@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
webView.settings.javaScriptEnabled = true
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
view?.loadUrl(request?.url.toString())
return true
}
}
webView.loadUrl("https://blog.csdn.net/cysion1989/article/details/73431003")
TmpTask().execute()
}
}
class TmpTask : AsyncTask() {
override fun doInBackground(vararg params: Void?): Void? {
while (true){
}
return null
}
}
一次比较完整的解决bug的流程,记录一下,或许对读者有帮助呢。