Android的webview速度慢
我的android webviews
是缓慢的。 从手机到3.0+
平板电脑都有足够的规格
我知道webviews应该是“有限的”,但是我看到networking应用程序完成了电话差距,必须使用各种CSS3
和JQuery
巫术,他们运行得很好,迅速
所以我错过了一些东西,是否有某种myWebview.SPEEDHACK(1)
,我可以用来加快速度?
另外,有时我的webview的内容只是不加载,而不是缓慢加载,它只是不会加载。 我正在testing的资产存储在本地,没有错误。
这取决于正在加载的Web应用程序。 尝试下面的一些方法:
设置更高的渲染优先级(从API 18+弃用):
webview.getSettings().setRenderPriority(RenderPriority.HIGH);
启用/禁用硬件加速:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // chromium, enable hardware acceleration webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); } else { // older android version, disable hardware acceleration webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); }
禁用caching(如果您的内容有问题):
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
在清单中添加这个android:hardwareAccelerated="true"
是唯一显着提高性能的东西
更多信息在这里: http : //developer.android.com/guide/topics/manifest/application-element.html#hwaccel
对我们来说,解决scheme恰恰相反。 我们通过使用以下代码,仅在WebView上禁用硬件加速(而不是在清单中的整个应用程序上):
if (Build.VERSION.SDK_INT >= 11){ webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); }
现在CSS3animation更stream畅。 我们正在使用Android 4.0。
更多信息请访问https://code.google.com/p/android/issues/detail?id=17352
我有这个问题,我不得不解决。 我尝试了这些解决scheme,但最终的performance,至less对于滚动,并没有改善。 所以在这里,我所做的工作,以及为什么它为我工作的解释。
如果您有机会通过创build一个“MiWebView”类,覆盖“onTouchEvent”方法并至less打印每个拖动事件发生的时间,来探索拖动事件,您将看到它们是分离的在(到)9ms以外的时间。 这是事件之间很短的时间。
看看WebView的源代码 ,只看到onTouchEvent函数。 处理器在9ms以内处理是不可能的(继续做梦!!!)。 这就是为什么你经常看到“因为我们正在等待WebCore的反应,触摸下来的拖拉小姐”。 信息。 代码不能按时处理。
如何解决它? 首先,你不能重写onTouchEvent代码来改进它,它太多了。 但是,你可以“嘲笑”,以限制拖动动作的事件率,比如说40ms或50ms。 (这取决于处理器)。
所有触摸事件都是这样的:ACTION_DOWN – > ACTION_MOVE …… ACTION_MOVE – > ACTION_UP。 所以我们需要保持向上和向下运动,并过滤移动速度(这些是坏人)。
这里是一个方法来做到这一点(你可以添加更多的事件types,像2个手指触摸,所有我感兴趣的是单指滚动)。
import android.content.Context; import android.view.MotionEvent; import android.webkit.WebView; public class MyWebView extends WebView{ public MyWebView(Context context) { super(context); // TODO Auto-generated constructor stub } private long lastMoveEventTime = -1; private int eventTimeInterval = 40; @Override public boolean onTouchEvent(MotionEvent ev) { long eventTime = ev.getEventTime(); int action = ev.getAction(); switch (action){ case MotionEvent.ACTION_MOVE: { if ((eventTime - lastMoveEventTime) > eventTimeInterval){ lastMoveEventTime = eventTime; return super.onTouchEvent(ev); } break; } case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: { return super.onTouchEvent(ev); } } return true; } }
当然,使用这个类,而不是WebView,你会看到滚动时的差异。
这只是解决scheme的一种方法,但是由于使用WebView时的屏幕触摸,所有滞后情况仍然没有完全实现。 但是,这是我发现的最好的解决scheme,至less对于我的具体需求。
我认为以下效果最好:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); } else { webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); }
Android 19具有用于WebView的Chromium引擎。 我想这与硬件加速更好。
我尝试了所有的build议来修复我的phonegap应用程序中的渲染性能问题。 但没有什么真正的工作。
最后,经过一整天的search,我做到了。 我在AndroidManifest的标签(而不是标签)中设置
<application android:hardwareAccelerated="false" ...
现在,该应用的行为与我的浏览器一样快速。 看起来像,如果硬件加速并不总是最好的function…
详细的问题,我有: https : //stackoverflow.com/a/24467920/3595386
如果您的webview中只有less数组件是缓慢或滞后的,请尝试将其添加到元素css中:
transform: translate3d(0,0,0); -webkit-transform: translate3d(0,0,0);
这是唯一的速度,真正影响我的web视图。 但要小心,不要过度使用它! (你可以阅读更多关于这篇文章的破解。)
没有一个答案对我没有帮助。
最后我find了理由和解决办法。 原因是很多CSS3filter(filter,-webkit-filter)。
解
我已经在网页脚本中添加了对WebView的检测,以便将类“低质量”添加到HTML主体。 BTW。 您可以通过在WebView设置中设置用户代理来轻松跟踪WebView。 然后我创build了新的CSS规则
body.lowquality * { filter: none !important; }
尝试这个:
mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
如果你绑定了onclick
事件,那么在触摸屏上可能会很慢。
为了让它更快,我使用fastclick ,它使用更快的触摸事件来模仿点击事件。