Android WebViewClient回调调用过于频繁

时间:2011-02-19 07:59:12

标签: android webview webviewclient

当我致电WebView#loadUrl时,我希望我只能拨打一次WebViewClient#onPageFinished电话,而不会拨打WebViewClient#shouldOverrideUrlLoading电话。但是,我得到一个WebViewClient#shouldOverrideUrlLoading(我通过始终调用WebView#loadUrl并返回true来实现),然后使用相同的URL调用两个WebViewClient#onPageFinished

我正在加载的页面使用了很多ajax请求。 ajax请求是否会调用WebViewClient?我的页面中没有任何元刷新。

这非常令人沮丧。我做错了吗?

2 个答案:

答案 0 :(得分:12)

这是来自a google groups discussion I started on the topic的交叉帖子。

我做了更多研究,我想我理解正在发生的一切。

这是我的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);
  }
}

我的服务器有以下网址重定向:

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

这些网址是我无法控制的服务器的一部分,所以我只需要处理这种行为。

以下是加载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

根据文档,我不指望这种行为。请注意,onPageStartedonPageFinished的数量不平衡。我特别不喜欢使用重定向的网址调用onPageFinished,但WebView不包含我的内容。我知道这种行为可能是不可改变的,但至少应记录这种意外行为。

答案 1 :(得分:4)

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

您无需显式调用 webView.loadUrl(url)。通过重写返回true将自动获取现有的webview来处理新的页面加载。通过不必要地调用它,它在原始周期(onPageStarted - > onPageFinished)的中间在webView上启动一个全新的网页加载循环,因此总共触发了额外的回调循环。