【发布时间】:2013-02-28 04:51:45
【问题描述】:
我正在开发一款名为 Lightning Browser 的开源浏览器,但在最近更新到 Android (4.2.2) 时遇到了一些问题。
在触摸视图之前,WebViews 将无法完全呈现。它仅发生在最新的 Android 版本上。在 4.2.1 上,WebView 渲染得非常好。我使用 Nexus 7 进行开发,在收到 4.2.2 更新后,浏览器立即停止渲染。其他用户也遇到过这种情况,并且多次确认仅在 4.2.2 上发生。它正在针对 API 级别 16 和 17 发生,但我已经看到针对 API 级别 9 的 WebKit 浏览器没有这个问题。
我已尝试使用我在 Stack Overflow (Android WebView renders blank/white, view doesn't update on css changes or HTML changes, animations are choppy) 上找到的问题的解决方案来解决此问题。但是,仅将 WebView 的 RenderPriority 设置为高并不能解决它......让它在不被触摸的情况下呈现的唯一方法是将 invalidate() 命令放在 WebView 的 OnDraw() 方法中。这会导致 WebView 不断地重新绘制。这可行(有点),动画很流畅,页面加载非常快,但否则会导致 WebView 的性能下降。
我也看过这个问题(与我的非常相似),但没有很好的答案。 Android WebView Fails to Completely Render Content Until User Interaction
我所说的性能下降是指输入。文本输入滞后,WebView 本身无法像以前那样处理正在发生的事情。使用 invalidate() 方法调用对浏览器进行基准测试会使基准测试性能下降约 8%。我知道基准测试并不是万能的,但它告诉我连续绘图正在使系统紧张并导致系统忽略其他任务。
结论... Android 4.2.2 中的 WebView 在触摸之前不会呈现。我知道解决此问题的唯一方法是在 WebView 的 onDraw() 方法中调用 invalidate()。这对性能不利,我正在寻找一种不同的方法来解决这个问题。
魔法密码(我正在使用)...
class MyWebView extends WebView
{
@Override
onDraw(Canvas canvas)
{
invalidate();
super.OnDraw(canvas);
}
}
删除
invalidate();
在被触摸之前它不会渲染。
有没有人对如何使 WebView 呈现(除了我所做的)有任何建议?顺便说一句,这是我在 Stack 上提出的第一个问题,如果我不清楚或者我做错了什么,请原谅我。
编辑: 我发现这个问题here 是关于一个类似的问题,它已经解决了,问题是,我什至不明白答案是什么意思。如果有人能启发我,它可能会有所帮助。
我在 logcat 中收到此错误
E/chromium(1243): external/chromium/net/disk_cache/backend_impl.cc:2022: [0705/172030:ERROR:backend_impl.cc(2022)] Corrupt Index file
【问题讨论】:
-
那个问题与我们的问题无关,页面是空白的,但是因为加载它有异常问题,与渲染管道无关。
-
顺便说一句...在我的情况下,键盘/输入性能非常糟糕(并且随着页面复杂性的增加而降低),我选择在运行时使用 JQuery 触发本机输入覆盖选择 HTML 输入。它不是很优雅,但本机输入完美无缺,文本选择/剪切/粘贴并不令人沮丧......
-
一种不会降低性能的替代方案stackoverflow.com/a/19253633/236743 :)