当我致电WebView#loadUrl
时,我希望我只能拨打一次WebViewClient#onPageFinished
电话,而不会拨打WebViewClient#shouldOverrideUrlLoading
电话。但是,我得到一个WebViewClient#shouldOverrideUrlLoading
(我通过始终调用WebView#loadUrl并返回true来实现),然后使用相同的URL调用两个WebViewClient#onPageFinished
。
我正在加载的页面使用了很多ajax请求。 ajax请求是否会调用WebViewClient
?我的页面中没有任何元刷新。
这非常令人沮丧。我做错了吗?
答案 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
根据文档,我不指望这种行为。请注意,onPageStarted
和onPageFinished
的数量不平衡。我特别不喜欢使用重定向的网址调用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上启动一个全新的网页加载循环,因此总共触发了额外的回调循环。