我已经在我的 Android 应用程序中实现了一个 WebView(根据文档)。我使用自定义 WebViewClient 并覆盖 shouldOverrideUrlLoading 以显示在新活动中单击的链接,几乎与文档显示的一样。
我遇到的问题是我的应用程序接收指示链接已被单击的消息所花费的时间(例如,调用 shouldOverrideUrlLoading)。通常,它会在 1-2 秒内发生(几乎可以接受),但有时需要 10++ 秒(!!根本不可接受)。请注意,我已阅读有关 Android WebView 触摸响应性的此线程并了解固有的 300 毫秒延迟,但我的延迟时间要糟糕得多。另请注意,渲染/滚动速度不是问题(事实上,我可以非常快地向下滚动 WebView)。
我最好的猜测是延迟来自页面上的 Javascript,尽管我不知道如何调试它甚至证实我的怀疑!我已经在我的 Javascript 中插入了许多 console.log() 语句并且没有看到太多发生,所以如果这甚至是问题的话,很难缩小范围。
我也尝试过根据这个线程禁用缓存。
我用于实例化 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 内置浏览器中测试了我的网络应用程序,它在那里工作得很好。没有任何滞后;链接点击实时打开。