2013-02-28 73 views
22

我正在开发一个名为Lightning Browser的开源浏览器,并且我遇到了有关Android(4.2.2)的最新更新的一些问题。WebView无法呈现,直到触及Android 4.2.2

在视图被触摸之前,WebViews将无法完全呈现。它只发生在最新的Android版本上。在4.2.1上,WebView呈现完全正常。我使用Nexus 7进行开发,在我收到4.2.2更新后,浏览器停止了渲染。其他用户也经历过这种情况,并且仅在4.2.2上多次确认。它正在针对API级别16和17发生,但是我看到了一个WebKit浏览器,其目标是API级别9,而没有此问题。

我试图用这个解决方案来解决这个问题,我在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 
+0

这个问题与我们的问题没有关系,页面是空白的,但是因为加载它有异国情调的问题,与渲染管道无关。 – rupps 2013-05-09 23:28:17

+0

顺便说一句...在我的情况下,键盘/输入性能是如此糟糕(并且随着页面复杂度的增加而下降),我选择JQuery在运行时,在选择HTML输入时触发本地输入重叠。它不是很优雅,但本机输入完美地工作,文本选择/剪切/粘贴并不令人沮丧... – rupps 2013-05-09 23:46:31

+0

替代不会降低性能http://stackoverflow.com/a/19253633/236743 :) – Dori 2013-10-08 16:49:11

回答

9

所以,我终于发现了问题引起的WebView不渲染。我正在启动并停止WebView的WebViewClient内的drawable动画。这个drawable只是一个刷新按钮,当页面加载时会旋转...简单的权利?

那么在浏览器的非全屏模式下,旋转drawable和WebView都是同一父级的子级,而在全屏模式下,drawable变成WebView的子级。不知何故,通过在页面加载时开始动画并在完成时停止它(全屏),应用程序决定旋转绘图是需要所有绘图能力和​​WebView从不绘制的。当处于全屏模式并且可绘制成为WebView的孩子时,WebView然后具有比可绘制更高的渲染优先级,并且它绘制得很好。

故事的寓意是... WebViews喜欢成为绘制最高优先级的视图。如果其他视图具有更高的优先级,则它们将无法正确绘制。

我不是动画专家,所以我需要重新思考我现在如何动画drawable,以便不中断WebView。

希望这是有道理的。谢谢阅读。

+1

说话关于动画,我已经看到,如果你在页面的某个地方应用一个虚拟的HTML动画,它会触发一个webview重绘...但它是一个非常肮脏的黑客.... – rupps 2013-05-09 23:23:57

+0

OMG。这正是我正在做的!自从很多天以来,我被卡住了,为什么drawables不能加载。非常感谢。所以答案是不使用旋转动画? – 2014-04-16 06:11:31

+0

但是这不会发生在运行Android Kitkat的设备上。他们修理了什么吗? – 2014-04-16 15:06:45

2

请参阅@Olivier在Android WebView renders blank/white, view doesn't update on css changes or HTML changes, animations are choppy上的最后一个答案,他触发了一对夫妇在WebView的OnTouchEvent上延迟无效,而不是onDraw上的连续...在我的情况下,它的工作原因是(大部分)我的问题是在用户触摸webview我改变了一些CSS作为回应。当然,它并不适用于自动/超时css的情况下

在我的情况下,它也有助于从Java导出JavaScript函数以手动触发无效延迟,所以如果在JavaScript中您更多或更低知道哪里有灾难可能发生,你可以手动触发它,喜欢你的WebView这里面内部类:

public class MyWebView extends WebView { 

    private class InvalidateExtension { 

     private Handler handler=new Handler(); // you might already have a handler 
     private Runnable mInvalidater=new Runnable() { 

      @Override 
      public void run() { 
       MyWebView.this.invalidate(); 
      } 

     } 

     public void trigger(int delay) { 
       handler.postDelayed(mInvalidater, delay); 
       handler.postDelayed(mInvalidater, 2*delay); // just in case 
       handler.postDelayed(mInvalidater, 4*delay); // just in case just in case :) 
     } 
    } 


    /** Call this function on this view's init, BEFORE loading a page so it is available to JS */ 
    private void call_me_on_init_to_enable_hack() { 
     addJavascriptInterface(new InvalidateExtension(), "Invalidater"); 
    } 
} 

所以,从JavaScript你可以这样做:

Invalidater.trigger(100); 

而且随着毫秒玩值....

希望这可以帮助别人!

机器人:在你的清单

3

禁用硬件加速硬件加速=“假”

+2

可能不是最好的解决方案,但唯一适用于我的案例。 – SSemashko 2013-09-24 09:25:19

+0

这个工程,但@Scarmysun说是不可取的 – vanthome 2014-09-15 13:27:15

2

旋转手机时,这将导致此问题,使用全部或部分页面有一个与缩放比例问题将不会被绘制。在WebViewClient实现中解决此覆盖onScaleChanged并使视图无效。这应该在需要时强制重绘。

@Override 
    public void onScaleChanged(WebView view, float oldScale, float newScale) { 
     if (view != null) { 
      view.invalidate(); 
     } 
    } 
+1

感谢您的提示! – anthonycr 2013-06-26 21:13:20