2012-11-20 24 views
16

Tôi đang cố gắng thực hiện một tác vụ trên Android WebView sau khi trang web của tôi hoàn tất tải trong đó. Tôi thiết lập WebView của tôi để có một WebViewClient để sử dụng sự kiện gọi lại onPageFinished. Tuy nhiên, sau khi một số thử nghiệm, nó dường như không chờ đợi cho đến khi tất cả các JS trên trang được thực hiện tải trước khi mã onPageFinished của tôi cháy.Điều gì được coi làPageFinished trong Android WebViewClient?

Các tài liệu của Google nói điều này:

public void onPageFinished (WebView view, String url) 

gia tăng ở mức API 1 Thông báo cho các ứng dụng máy chủ rằng một trang đã tải xong. Phương thức này chỉ được gọi cho khung chính. Khi onPageFinished() được gọi, hình ảnh hiển thị có thể chưa được cập nhật. Để nhận được thông báo cho Ảnh mới, hãy sử dụng onNewPicture (WebView, Ảnh).

thông số

xem Các WebView được khởi xướng gọi lại.

url Url của trang.

1) OnPageFinished chỉ chờ DOM tải?

2) Có cách nào để phát hiện khi bất kỳ JS nào trên trang kết thúc? Nếu vậy, tôi nên sử dụng cái gì?

Tôi không thấy bất kỳ điều gì trong WebViewClient sẽ có mục đích đó. Tôi không muốn thêm chậm trễ vì người dùng của tôi có thể sử dụng EDGE hoặc trên LTE.

Trả lời

7

Bạn cần triển khai cuộc gọi lại từ WebChromeClient. OnPageFinished() là một API được cung cấp bởi WebViewClient. chưa có một giao diện có tên WebChromeClient cung cấp các thông tin tiến bộ bạn đang tìm kiếm:

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

Mở liên kết ở trên và tìm kiếm xem onProgressChanged (WebView, int newProgress) - biến 'newProgress' cho bạn phần trăm tải trang đã hoàn thành. Khi đạt đến 100, bạn có một trang hợp lệ. onPageFinished() không thể được sử dụng một cách đáng tin cậy cho điều này (do chuyển hướng phía máy chủ, v.v.)

Tôi không biết ý bạn là gì khi "JS trên trang được hoàn thành". Có lẽ bạn có thể làm rõ những gì bạn có nghĩa là gì?

+0

Tôi đang cố gắng xác định thời điểm Javascript được liên kết với trang đang chạy xong.Từ công việc của tôi, tôi thấy rằng onPageFinished được gọi khi các phần HTML của trang được tải xong - không nhất thiết khi Javascript hoàn tất. Phương pháp bạn đang trỏ vào không cho tôi câu trả lời mà tôi cần, đó là, "Có cách nào để phát hiện khi có [Javascript] trên trang kết thúc không? Nếu vậy, tôi nên sử dụng cái gì?" – Steven

+0

Khi bạn nói "JS trên trang kết thúc" ý định của bạn ở đây là gì? Ý của bạn là "khi nó đã thực hiện xong". Nếu đó là ý của bạn thì bạn có thể muốn.) Tạo một Giao diện JavaScript giữa mã HTML (web) và mã Java của bạn (android) bằng cách sử dụng phương thức addJavascriptInterface() (một thành viên của lớp WebViewClient) hoặc b.) Thêm một số nhật ký tùy chỉnh hoặc cảnh báo vào hàm JS và phát hiện nó bằng cách sử dụng các phương thức onConsoleMessage()/onJsAlert() thuộc về lớp WebChromeClient. – Sriram

0

Để trả lời câu hỏi đầu tiên của bạn: Tôi đã phát hiện ra rằng onProgressChanged sẽ không đạt được 100, và onPageFinished sẽ không được gọi cho đến khi tất cả các tài sản (css/js/images) đã hoàn tất tải cho trang đó.

Tôi không thể tìm thấy bất kỳ tài liệu chính thức nào nêu rõ điều đó.

1

Từ:

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; 
     } 
    } 

Chúng ta có thể dễ dàng thấy rằng onPageFinished không phải là khá nhiều những gì bạn đang mong đợi.

Các vấn đề liên quan