18

ウェブページの読み込みが完了した後、AndroidWebViewでアクションを実行しようとしています。onPageFinishedイベントコールバックを利用するWebViewClientを持つようにWebViewを設定しました。ただし、いくつかのテストの後、onPageFinishedコードが起動する前に、ページ上のすべてのJSの読み込みが完了するまで待機していないようです。

Googleのドキュメントには次のように書かれています。

public void onPageFinished (WebView view, String url)

APIレベル1で追加ページの読み込みが完了したことをホストアプリケーションに通知します。このメソッドは、メインフレームに対してのみ呼び出されます。onPageFinished()が呼び出されたとき、レンダリング画像はまだ更新されていない可能性があります。新しい画像の通知を受け取るには、onNewPicture(WebView、Picture)を使用します。

パラメーター

viewコールバックを開始しているWebView。

urlページのURL。

1)onPageFinishedは、DOMがロードされるのを待つだけですか?

2)ページ上のJSがいつ終了したかを検出する方法はありますか?もしそうなら、私は何を使うべきですか?

その目的のためのWebViewClientには何も表示されません。ユーザーはEDGEまたはLTEを使用できるため、遅延を追加したくありません。

4

3 に答える 3

7

WebChromeClient からのコールバックを実装する必要があります。onPageFinished() は WebViewClient が提供する API です。探している進行状況情報を提供する WebChromeClient という名前のさらに別のインターフェイスがあります。

http://developer.android.com/reference/android/webkit/WebChromeClient.html#onProgressChanged(android.webkit.WebView , int)

上記のリンクを開いて、onProgressChanged(WebView view, int newProgress) を探します。「newProgress」変数は、完了したページ読み込みのパーセンテージを示します。100 に達すると、有効なページがあります。これには onPageFinished() を確実に使用することはできません (サーバー側のリダイレクトなどのため)

「ページ上の JS が終了したとき」という意味がわかりません。多分あなたはあなたが何を意味したかを明確にすることができますか?

于 2013-01-30T18:47:54.883 に答える
2

から:

https://chromium.googlesource.com/chromium/src.git/+/master/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java

    @Override
    public void didFinishNavigation(final String url, boolean isInMainFrame, boolean isErrorPage,
            boolean hasCommitted, boolean isSameDocument, boolean isFragmentNavigation,
            Integer pageTransition, int errorCode, String errorDescription, int httpStatusCode) {
        ...
        if (client != null && isFragmentNavigation) {
            client.getCallbackHelper().postOnPageFinished(url);
        }
    }

    @Override
    public void didFailLoad(
            boolean isMainFrame, int errorCode, String description, String failingUrl) {
        AwContentsClient client = mAwContentsClient.get();
        if (client == null) return;
        String unreachableWebDataUrl = AwContentsStatics.getUnreachableWebDataUrl();
        boolean isErrorUrl =
                unreachableWebDataUrl != null && unreachableWebDataUrl.equals(failingUrl);
        if (isMainFrame && !isErrorUrl && errorCode == NetError.ERR_ABORTED) {
            // Need to call onPageFinished for backwards compatibility with the classic webview.
            // See also AwContents.IoThreadClientImpl.onReceivedError.
            client.getCallbackHelper().postOnPageFinished(failingUrl);
        }
    }

    @Override
    public void didStopLoading(String validatedUrl) {
        if (validatedUrl.length() == 0) validatedUrl = ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL;
            AwContentsClient client = getClientIfNeedToFireCallback(validatedUrl);
        if (client != null && validatedUrl.equals(mLastDidFinishLoadUrl)) {
            client.getCallbackHelper().postOnPageFinished(validatedUrl);
        mLastDidFinishLoadUrl = null;
        }
    }

onPageFinished が期待どおりではないことが簡単にわかります。

于 2017-09-20T07:48:44.120 に答える
0

あなたの最初の質問に答えるために: にonProgressChanged到達せず100onPageFinishedそのページのすべてのアセット (css/js/images) の読み込みが完了するまで呼び出されないことがわかりました。

ただし、それを示す公式ドキュメントは見つかりません。

于 2014-09-08T01:52:08.780 に答える