Android WebView + loadUrl with javascript + onPageFinished = lag

问题描述 投票:0回答:3

我有加载一些页面的 WebView,当它完成时,我应用一些 javascript 魔法来搞乱 DOM。一切都很好,页面加载并且

onPageFinished
我只是打电话给
wv.loadUrl(javascript);

但是我不想看到加载过程,以及 JavaScript 是如何工作的,我只需要结果,所以我从一开始就用

wv.setVisibility(View.INVISIBLE);
使我的视图不可见,并在一切完成后使其再次可见。这就是问题发生的地方。

这段代码应该使视图在 javascript 完成后可见,但

wv.setVisibility(View.VISIBLE)
在 javascript 之前触发。因此,我暂时看到了页面以及它是如何被 javascript 更改的。这太丑了。

  public void onPageFinished (WebView view, String url) {
         wv.loadUrl(javascript);
         view.getSettings().setLoadsImagesAutomatically(true);
         wv.setVisibility(View.VISIBLE);

    }

我发现loadUrl是异步工作的,所以我尝试在

onPageFinished
中使用“使第一个视图可见”方法创建另一个WebViewClient,并用它来调用JS。但它总是因 NPE 错误而崩溃。

wv2.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished (WebView view, String url) {
     wv.setVisibility(View.VISIBLE);
}
});

现在我只是在 javascript 之后添加了延迟(

SystemClock.sleep(5000)
),但这就像......是的。

javascript android webview
3个回答
1
投票

好吧,我想我明白了。我们可以从 javascript 末尾进行回调,该回调将触发“显示视图” - 例如 herehere (使用处理程序,因为我想更新 ui)。 但这不会改变任何东西,问题似乎在于渲染速度。只是很慢。所以现在我将在触发 JS 后坚持 1 秒延迟。


0
投票

我认为您不会找到简单的解决方案。 Android 可以检测到(像大多数浏览器一样)的是页面何时完全加载,这意味着所有页面都已下载。 JavaScript 也会等待它被下载,然后开始运行。这就是它的工作原理。我能想到的唯一解决方案可能就是 JQuery。我对此了解不多,但里面通常有类似问题的解决方案。


0
投票

Совет。

wv.setVisibility(View.INVISIBLE)
оставляет в макете место под этот элемент, то есть если ниже него есть другие элементы, они смещаются。 Это может выглядеть некрасиво Я всегда ставлю свойство
GONE
,это не мешает загружать страницы,а по окончании загрузки ставить
VISIBLE

© www.soinside.com 2019 - 2024. All rights reserved.