我android webviews
很慢 从手机到3.0+
平板电脑,一切都超过规格
我知道网络浏览量应该是“有限的”,但我发现网络应用程序必须通过电话间隙来完成,并且必须使用各种手段CSS3
和手段JQuery
,它们运行良好且速度很快
所以我缺少了什么,是否myWebview.SPEEDHACK(1)
可以使用某种方法来加快速度?
另外,有时我的webview的内容只是不加载,而不是缓慢加载,而不会加载。我正在测试的资产存储在本地,没有错误。
我android webviews
很慢 从手机到3.0+
平板电脑,一切都超过规格
我知道网络浏览量应该是“有限的”,但我发现网络应用程序必须通过电话间隙来完成,并且必须使用各种手段CSS3
和手段JQuery
,它们运行良好且速度很快
所以我缺少了什么,是否myWebview.SPEEDHACK(1)
可以使用某种方法来加快速度?
另外,有时我的webview的内容只是不加载,而不是缓慢加载,而不会加载。我正在测试的资产存储在本地,没有错误。
Answers:
这取决于正在加载的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
android:hardwareAccelerated="true"
CSS 3D动画在开始播放之前有很长的延迟,因此无法在其他可滚动DIV中滚动DIV,并且该应用程序更加不稳定。
对我们而言,解决方案则相反。通过使用以下代码,我们仅在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
WebView not displayed because it is too large to fit into a software layer (or drawing cache), needs 11534400 bytes, only 8294400 available
我认为以下方法最有效:
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引擎。我猜想它与硬件加速效果更好。
我遇到了同样的问题,必须解决。我尝试了这些解决方案,但最后的性能,至少对于滚动没有任何改善。所以在这里,我确实做了工作,并解释了为什么对我有用。
如果您有机会通过创建“ MiWebView”类,覆盖“ onTouchEvent”方法并至少打印每个拖动事件发生的时间来探索拖动事件,那么您会发现它们是分开的及时(最短)9ms之内。在两次事件之间的时间很短。
看一下WebView源代码,然后看看onTouchEvent函数。处理器不可能在不到9ms的时间内完成处理(继续做梦!!!)。这就是为什么您会不断看到“在等待WebCore响应时,您会感到不便的原因”。信息。代码无法按时处理。
如何解决?首先,您无法重新编写onTouchEvent代码以对其进行改进,这实在太多了。但是,您可以“模拟它”以将拖动动作的事件速率限制为40ms或50ms。(这取决于处理器)。
所有的触摸事件都是这样的:ACTION_DOWN-> ACTION_MOVE ...... ACTION_MOVE-> 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时触摸屏幕,仍不能完全解决所有滞后情况。但是,这是我发现的最佳解决方案,至少满足了我的特定需求。
我尝试了所有建议以解决我的phonegap应用程序中的渲染性能问题。但是没有任何真正的工作。
终于,经过一整天的搜索,我做到了。我在AndroidManifest的标签(而非标签)中设置
<application android:hardwareAccelerated="false" ...
现在,该应用程序的行为方式与我的网络浏览器相同。似乎,如果硬件加速并不总是最好的功能...
我遇到的详细问题:https : //stackoverflow.com/a/24467920/3595386
这些答案都对我没有帮助。
最后,我找到了原因和解决方案。原因是很多CSS3过滤器(过滤器,-webkit-filter)。
解
我在网页脚本中添加了对WebView的检测,以便将类“ lowquality”添加到HTML正文中。顺便说一句。通过在WebView设置中设置用户代理,可以轻松跟踪WebView。然后我创建了新的CSS规则
body.lowquality * { filter: none !important; }
如果您绑定到onclick
事件,则在触摸屏上可能会变慢。
为了使其更快,我使用fastclick,它使用快得多的触摸事件来模仿click事件。
$('#').on('touchstart', function() {...});
,而不是onclick