【问题标题】:Debugging slow click-responsiveness on Android WebViews?在 Android WebViews 上调试缓慢的点击响应?
【发布时间】: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 函数?

标签: android android-webview


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    <application android:hardwareAccelerated="true">
    

    有关此的更多信息...请参阅下面的链接...

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

    【讨论】:

    • 我在 OP 中声明我已经启用了硬件加速。
    【解决方案3】:

    如果您使用的是 Spine/BackBone 而不是 Click 事件,则更改为 touch start 会更快。

    '点击#Debug':'Function_name'

    替换为

    'touchstart #debug':函数名称

    或许能帮到你。

    【讨论】:

    • 在 OP 中,我说我已经阅读了关于这个主题的链接帖子(这没有帮助 - 谷歌有一篇关于这个的整篇文章)。此外,我什至不在这里谈论 Javascript 函数。只需直接点击 标签,不涉及 javascript。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多