Android WebViewClient обратные вызовы вызывается слишком часто - PullRequest
4 голосов
/ 19 февраля 2011

Когда я звоню WebView#loadUrl, я ожидаю, что я получу только один WebViewClient#onPageFinished звонок, а не WebViewClient#shouldOverrideUrlLoading звонок.Однако я получаю WebViewClient#shouldOverrideUrlLoading (который я реализую, всегда вызывая WebView # loadUrl и возвращая true), а затем два WebViewClient#onPageFinished вызова с одним и тем же URL.Аякс просит.Запросы ajax вызывают WebViewClient?На моей странице нет мета-обновлений.

Это довольно сложно.Я что-то не так делаю?

Ответы [ 2 ]

12 голосов
/ 05 марта 2011

Это кросс-пост от обсуждения групп Google, которое я начал в теме .

Я провел больше исследований, и мне кажется, я понимаю все, что происходит.

Вот мой WebViewClient:

public class MyWebViewClient extends WebViewClient {
  @Override
  public void onPageStarted(WebView view, String url, Bitmap favicon) {
    System.out.println("onPageStarted: " + url);
  }

  @Override
  public boolean shouldOverrideUrlLoading(WebView webView, String url) {
    System.out.println("shouldOverrideUrlLoading: " + url);
    webView.loadUrl(url);
    return true;
  }

  @Override
  public void onPageFinished(WebView webView, String url) {
    System.out.println("onPageFinished: " + url);
  }
}

У меня есть следующие перенаправления URL с моего сервера:

http://example.com/resource -> http://example.com/user-name/resource
http://example.com/logout.jsp -> http://example.com/login/logout
http://example.com/login/logout -> http://example.com/login

Эти URL являются частью сервера, который я не контролирую, поэтому мне просто нужно разобраться с поведением.

Вот выход из загрузки http://example.com/resource

onPageStarted: http://example.com/resource
onPageStarted: http://example.com/user-name/resource
shouldOverrideUrlLoading: http://example.com/user-name/resource
onPageFinished: hhttp://example.com/user-name/resource

На данный момент у моего WebView пустое содержимое. Я должен ждать до второго onPageFinished, чтобы захватить мой контент.

onPageStarted: http://example.coms/user-name/resource
onPageFinished: http://example.com/user-name/resource

Вот выход из загрузки http://example.com/logout.jsp

onPageStarted: http://example.com/logout.jsp
onPageStarted: http://example.com/login/logout
shouldOverrideUrlLoading: http://example.com/login/logout
onPageFinished: http://example.com/login/logout
onPageStarted: http://example.com/login/logout
onPageStarted: http://example.com/login
shouldOverrideUrlLoading: http://example.com/login
onPageFinished: http://example.com/login

снова, на этом этапе у моего WebView есть пустая страница. Мне нужно подождать до 3-го onPageFinished, чтобы получить мой контент с WebView.

onPageStarted: http://example.com/login
onPageFinished: http://example.com/login

На основании документации я не ожидаю такого поведения. Обратите внимание, что существует несбалансированное число onPageStarted с и onPageFinished с. Мне особенно не нравится, как onPageFinished вызывается с моим перенаправленным URL, но WebView не содержит моего контента. Я понимаю, что это поведение, вероятно, невозможно изменить, но это неожиданное поведение должно быть, по крайней мере, задокументировано.

4 голосов
/ 28 апреля 2016
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
    System.out.println("shouldOverrideUrlLoading: " + url);
    return true;
}

Вам не нужно явно вызывать webView.loadUrl (url) . При переопределении возврата true автоматически получит существующее веб-представление для обработки новой загрузки страницы. Неоправданно вызывая это, он запускает новый цикл загрузки веб-страниц в этом веб-представлении в середине первоначальных циклов (onPageStarted -> onPageFinished), следовательно, в итоге запускается дополнительный цикл обратного вызова.

...