Android 网页浏览速度很慢

我的 android webviews是慢的。这是从手机到 3.0+平板电脑的一切超过足够的规格

我知道网络视图应该是“有限的”,但我看到网络应用程序做了电话间隙,必须使用各种 CSS3JQuery魔法,他们运行得很好,速度很快

所以我漏掉了一些东西,有没有什么 myWebview.SPEEDHACK(1)可以让我加快速度?

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

177006 次浏览

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

在清单中添加这个 android:hardwareAccelerated="true"是唯一显著提高我性能的事情

更多信息请点击: Http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel

我也有同样的问题,我必须解决它。我尝试了这些解决方案,但最终性能,至少对于滚动没有任何改善。因此,这里的工作方法,我确实执行和解释为什么它确实为我工作。

如果你有机会通过创建一个“ MiWebView”类,覆盖“ onTouchEvent”方法,并至少打印出每个拖动事件发生的时间来探索拖动事件,你会看到它们在9毫秒之外被及时分离。这是一个非常短的时间间隔事件。

看一下 WebView 源代码,就会看到 onTouchEvent 函数。它只是不可能被处理器处理在不到9毫秒(继续做梦吧! ! !).这就是为什么您经常看到“错过一个拖累,因为我们正在等待 WebCore 的触地响应。”信息。代码就是不能按时处理。

怎么补救?首先,您不能重新编写 onTouchEvent 代码来改进它,这实在是太多了。但是,你可以“模仿它”,以限制事件率的拖动动作,让我们说,40毫秒或50毫秒。(这取决于处理器)。

所有触摸事件都是这样的: ACTION _ Down-> ACTION _ MOVE... ... ACTION _ MOVE-> ACTION _ UP。因此,我们需要保持向下和向上的运动,并过滤移动率(这些是坏家伙)。

这里有一个方法可以做到这一点(你可以添加更多的事件类型,如两个手指触摸,我在这里感兴趣的是单指滚动)。

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。然而,这是我找到的最好的解决方案,至少对我的具体需求是这样的。

我们的解决办法恰恰相反。我们使用以下代码只禁用了 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

试试这个:

mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

如果你的 webview 中只有一些组件比较慢或者比较慢,试着把它们添加到元素 css 中:

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

这是唯一一个真正对我的 webview 产生影响的 Speedhack。但是小心不要过度使用它!(你可以在 这篇文章中了解更多关于黑客攻击的信息。)

如果您绑定到 onclick事件,那么它在触摸屏上可能会比较慢。

为了使它更快,我使用 快速点击,它使用更快的触摸事件来模拟点击事件。

我尝试了所有的建议,以解决我的手机应用程序渲染性能的问题。但没有一个真正的工作。

终于,经过一整天的寻找,我成功了。我在 AndroidManifest 的标签(而不是标签)中设置

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

现在这个应用程序的运行速度和我的浏览器一样快。看起来,如果硬件加速不总是最好的特征..。

我的具体问题是: https://stackoverflow.com/a/24467920/3595386

我认为以下方法最有效:

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在网络视图中使用了 Chromium 引擎,我想它在硬件加速上运行得更好。

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

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

解决方案

我在网页脚本中添加了 WebView 的检测,以便在 HTML 主体中添加类“低质量”。顺便说一句。通过在 WebView 设置中设置用户代理,可以轻松地跟踪 WebView。然后我创建了新的 CSS 规则

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