调试Android WebViews上的慢点击响应?

时间:2012-09-07 18:33:44

标签: android android-webview

我已经在我的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;
      }
}

和自定义网络视图客户端...

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内置浏览器中测试了我的网络应用程序,它在那里工作得很好。没有任何延迟;链接点击实时打开。

3 个答案:

答案 0 :(得分:1)

如果您还没有尝试过,请查看是否可以使用ADT Eclipse plugin support来比较应用和Android浏览器之间的traceview输出,分析点击链接到下一页打开之间的时间。结果可能不直接指向问题,但可能会给你一些提示。

This answer has a short description关于如何在Eclipse中的选定进程上使用该工具。

答案 1 :(得分:0)

如果您使用Spine / BackBone而不是Click事件更改来触摸启动会更快。

'点击#Debug':'Function_name'

将其替换为

'touchstart #debug':函数名称

可能会帮助你。

答案 2 :(得分:0)

在Android清单文件中,将以下属性添加到<application>标记,以便为您的应用启用硬件加速:

<application android:hardwareAccelerated="true">

有关此内容的更多信息,请参阅以下链接...

http://developer.android.com/guide/topics/graphics/hardware-accel.html