it-swarm.cn

Android webview很慢

我的Android webviews很慢。这是从手机到3.0+平板电脑的所有内容,具有足够的规格

我知道网页视图应该是“有限的”,但我看到网络应用程序完成了手机间隙,必须使用各种CSS3JQuery巫术,它们运行得很好,速度很快

所以我错过了一些东西,有什么myWebview.SPEEDHACK(1)可以用来加快速度吗?

另外,有时我的webview的内容只是不加载,而不是慢慢加载,它只是不会加载。我正在测试的资产存储在本地,没有错误。

161
CQM

这取决于正在加载的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);
}

禁用缓存(如果您的内容有问题):

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
123
peceps

在清单中添加此Android:hardwareAccelerated="true"是唯一能够显着改善性能的方法

更多信息: http://developer.Android.com/guide/topics/manifest/application-element.html#hwaccel

48
Sender

我们的解决方案恰恰相反。我们使用以下代码仅禁用WebView上的硬件加速(而不是清单中的整个应用程序):

if (Build.VERSION.SDK_INT >= 11){
    webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

CSS3动画现在更流畅了。我们使用的是Android 4.0。

更多信息: https://code.google.com/p/Android/issues/detail?id=17352

34
Ena

我认为以下效果最好:

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引擎。我猜它在硬件加速方面效果更好。

12
Tedi

我遇到了同样的问题,我不得不解决这个问题。我尝试了这些解决方案,但最后的表现,至少对于滚动来说根本没有改进。所以这里是我所做的工作,以及为什么它对我有用的解释。

如果你有机会通过创建一个“MiWebView”类,覆盖“onTouchEvent”方法并至少打印每个拖拽事件发生的时间来探索拖拽事件,你会看到它们是分开的及时(下至)9ms之遥。事件之间的时间非常短暂。

看看 WebView源代码 ,只看到onTouchEvent函数。它不可能在不到9ms的时间内被处理器处理(继续做梦!!!)。这就是为什么你经常看到“因为我们正在等待WebCore对降落的回应而错过拖累”。信息。代码无法按时处理。

怎么解决?首先,你不能重写onTouchEvent代码来改进它,它太多了。但是,你可以“嘲笑它”以限制拖动动作的事件率,比方说40ms或50ms。 (这取决于处理器)。

所有触摸事件都是这样的:ACTION_DOWN - > ACTION_MOVE ...... ACTION_MOVE - > ACTION_UP。所以我们需要保持DOWN和UP运动并过滤MOVE率(这些都是坏人)。

这是一种方法(你可以添加更多的事件类型,如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,您将看到滚动时的差异。

这只是解决方案的一种方法,但在使用WebView时由于屏幕触摸而导致的所有延迟情况仍未完全实现。然而,这是我发现的最佳解决方案,至少对我的具体需求而言。

9
Nate Castro

我尝试了所有提议来修复我的phonegap应用中的渲染性能问题。但没有任何结果。

最后,经过一整天的搜索,我成功了。我在AndroidManifest的标签(不是标签)中设置

<application Android:hardwareAccelerated="false" ...

现在,该应用程序的行为方式与我的webbrowser相同。似乎,如果硬件加速并不总是最好的功能......

我遇到的详细问题: https://stackoverflow.com/a/24467920/3595386

8
user3595386

这些答案都没有对我有帮助。

最后,我找到了理由和解决方案。原因是很多CSS3过滤器(filter,-webkit-filter)。

解决方案

我在网页脚本中添加了WebView检测,以便向HTML主体添加类“低质量”。 BTW。您可以通过在WebView设置中设置user-agent来轻松跟踪WebView。然后我创建了新的CSS规则

body.lowquality * { filter: none !important; }
4
l00k

如果您的webview中只有一些组件缓慢或滞后,请尝试将其添加到元素css中:

transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);

这是唯一真正对我的webview产生影响的速度。但要注意不要过度使用它! (你可以在 本文中阅读更多关于黑客的信息 。)

4
Erex

试试这个:

mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
3
George Maisuradze

如果绑定到onclick事件,触摸屏上可能会很慢。

为了加快速度,我使用 fastclick ,它使用更快的触摸事件来模仿click事件。

2
Tzach