我的android webviews
很慢。这适用于从手机到具有足够规格的3.0+
平板电脑的所有内容
我知道网页视图应该是“有限的”但我看到网络应用程序完成了手机间隙,必须使用各种CSS3
和JQuery
法术,它们运行得很好而且速度很快< / p>
所以我错过了什么,是否有某种myWebview.SPEEDHACK(1)
我可以用它来加快速度?
另外,有时我的webview的内容只是不加载,而不是慢慢加载,它只是不会加载。我正在测试的资产存储在本地,没有错误。
答案 0 :(得分:124)
这取决于正在加载的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);
答案 1 :(得分:48)
在清单中添加此android:hardwareAccelerated="true"
是唯一可以显着提高我性能的方法
更多信息: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel
答案 2 :(得分:35)
我们的解决方案恰恰相反。我们使用以下代码禁用了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
答案 3 :(得分:12)
我认为以下效果最佳:
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引擎。我猜它在硬件加速方面效果更好。
答案 4 :(得分:9)
我遇到了同样的问题,我不得不解决这个问题。我尝试了这些解决方案,但最后的表现,至少对于滚动来说根本没有改进。所以这里是我所做的工作,并解释了为什么它对我有用。
如果你有机会通过创建一个“MiWebView”类来覆盖“onTouchEvent”方法,并且至少打印出每个拖动事件发生的时间,那么你将有机会探索拖动事件,你会看到他们在9分钟之内(下至)分开。事件发生的时间非常短暂。
看看WebView Source Code,看看onTouchEvent函数。它不可能在不到9ms的时间内被处理器处理(继续做梦!!!)。这就是为什么你经常看到“因为我们正在等待WebCore对降落的回应而错过拖累”。信息。代码无法按时处理。
如何解决?首先,你不能重写onTouchEvent代码来改进它,它太多了。但是,你可以“嘲笑它”以限制拖动动作的事件率,比方说40ms或50ms。 (这取决于处理器)。
所有触摸事件都是这样的:ACTION_DOWN - &gt; ACTION_MOVE ...... ACTION_MOVE - &gt; ACTION_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时因屏幕触摸而导致的所有滞后情况仍未完全实现。然而,这是我找到的最佳解决方案,至少对我的具体需求而言。
答案 5 :(得分:8)
我尝试了所有提议来解决我的phonegap应用中的渲染性能问题。但没有任何结果。
最后,经过一整天的搜索,我成功了。我设置了AndroidManifest的标签(不是标签)
<application android:hardwareAccelerated="false" ...
现在,该应用程序的行为方式与我的webbrowser相同。似乎,如果硬件加速并不总是最好的功能...
答案 6 :(得分:4)
如果您的网页浏览中只有少数组件缓慢或滞后,请尝试将其添加到元素css中:
transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);
这是唯一真正对我的网页浏览产生影响的速度。但要注意不要过度使用它! (您可以在this article中阅读有关黑客的更多信息。)
答案 7 :(得分:4)
这些答案都没有对我有帮助。
最后我找到了理由和解决方案。原因是很多CSS3过滤器(filter,-webkit-filter)。
<强>解决方案强>
我在网页脚本中添加了WebView检测,以便添加类&#34; lowquality&#34;到HTML正文。 BTW。您可以通过在WebView设置中设置user-agent来轻松跟踪WebView。然后我创建了新的CSS规则
body.lowquality * { filter: none !important; }
答案 8 :(得分:3)
试试这个:
mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
答案 9 :(得分:2)
如果您绑定到onclick
事件,触摸屏上可能会很慢。
为了加快速度,我使用fastclick,它使用更快的触摸事件来模仿点击事件。