【发布时间】:2012-09-07 18:33:43
【问题描述】:
我在我的 Android 应用程序中实现了一个 WebView(每个 the documentation)。我使用自定义 WebViewClient 并覆盖 shouldOverrideUrlLoading 以显示在新活动中被点击的链接,几乎与文档显示的完全一样。
我遇到的问题是我的应用程序接收指示链接已被点击的消息所花费的时间(例如,调用 shouldOverrideUrlLoading)。通常,它会在 1-2 秒内发生(几乎可以接受),但有时需要 10++ 秒(!!根本不可接受)。请注意,我已阅读 this thread on Android WebView touch responsiveness 并了解固有的 300 毫秒延迟,但我的延迟时间要糟糕得多。另请注意,渲染/滚动速度不是问题(事实上,我可以非常快地向下滚动 WebView)。
我最好的猜测是延迟来自页面上的 Javascript,尽管我不知道如何调试它甚至确认我的怀疑!我在我的 Javascript 中插入了许多 console.log() 语句,但没有看到太多发生,所以如果这甚至是问题,很难缩小范围。
我也试过禁用缓存,per this thread。
我用于实例化 WebView 的代码如下。请注意,我的 Android 应用程序中唯一视图中的 WebView。我还在清单中打开了硬件加速。
// the _web_view is inflated, etc...
_web_view.getSettings().setSupportZoom(false);
_web_view.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
_web_view.setWebChromeClient(new CustomWebChromeClient());
_web_view.getSettings().setJavaScriptEnabled(true);
_web_view.getSettings().setDomStorageEnabled(true);
_web_view.setWebViewClient(new CustomWebViewClient());
_web_view.loadUrl(url);
FWIW,这是自定义 chrome 客户端:
public class CustomWebChromeClient extends WebChromeClient {
public boolean onConsoleMessage(ConsoleMessage cm) {
Log.d("Javascript", cm.message() + " -- From line "
+ cm.lineNumber() + " of "
+ cm.sourceId() );
return true;
}
}
以及自定义 Web 视图客户端...
public class CustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Intent intent = new Intent(view.getContext(), WebPopupActivity.class) ;
intent.putExtra("url", url);
MyApp.Singleton.startActivity(intent);
return true;
}
}
编辑:还应该注意的是,我已经在标准的 Android 内置浏览器中测试了我的网络应用程序,它在那里工作得很好。没有任何滞后;链接点击实时打开。
【问题讨论】:
-
你在不运行调试模式的时候试过这个吗?
WebView在调试时非常慢,但如果你只是运行而不是调试,它会快得多。 -
有趣的是,如果没有调试器,它似乎可以改善“最小”延迟,但“最大”延迟没有改变。
-
您如何衡量/计算您的响应时间?
-
我在第一行的 shouldOverrideURLLoading 函数以及 WebView 的 onTouch 方法(我使用 setOnTouchListener 绑定)中输出 Log.v()。因此,我使用的是 Android 操作系统捕获的触摸与 WebView 处理程序响应之间的时间。
-
您是否考虑过使用 Javascript 桥接而不是依赖 shouldOverrideUrlLoading 函数?