3

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

4

3 回答 3

1

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

这个答案有关于如何在 Eclipse 中的选定进程上使用该工具的简短描述。

于 2012-09-16T00:14:17.337 回答
0

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

'单击#Debug':'Function_name'

将其替换为

'touchstart #debug':函数名称

可能会帮助你。

于 2012-09-18T07:17:41.230 回答
0

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

<application android:hardwareAccelerated="true">

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

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

于 2012-09-18T14:20:10.887 回答