【问题标题】:How to detect when redirects in WebView finish?如何检测 WebView 中的重定向何时完成?
【发布时间】:2017-06-27 13:06:55
【问题描述】:

我浏览了在这里找到的所有相关帖子,但仍然无法正常工作。 我正在使用具有重定向的 URL(有时很多重定向)打开我的 WebView,我想知道加载何时真正完成(URL 完成加载,没有更多的重定向)。

有什么建议吗?

我读过的每篇文章都说要覆盖 shouldOverrideUrlLoading 但无论我做什么 shouldOverrideUrlLoading 都不会被调用。

我的代码:

mWebView = (WebView) findViewById(R.id.webview);
WebSettings settings = mWebView.getSettings();
settings.setLoadWithOverviewMode(true);
settings.setJavaScriptEnabled(true);
settings.setLoadsImagesAutomatically(true);
mWebView.setVerticalScrollBarEnabled(false);
mWebView.setHorizontalScrollBarEnabled(false);
mWebView.setWebViewClient(new MyWebViewClient());
mUrl = "http://cdn.something.com/something.html";
//    mUrl = "https://www.google.com";
mWebView.loadUrl(mUrl);



public class MyWebViewClient extends WebViewClient {

    public MyWebViewClient() {}

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        Log.d(TAG, "WebViewClient: shouldOverrideUrlLoading");
        return false;
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        Log.d(TAG, "WebViewClient: onPageStarted:  url: " + url);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        Log.d(TAG, "WebViewClient: onPageFinished: url: " + url);
        super.onPageFinished(view, url);
    }

}

谢谢

【问题讨论】:

  • 你试过onLoadResource方法了吗?
  • 检查this 答案.. 你必须在onPageStarted 的WebViewClient 方法中检查url 重定向是否完成...
  • @555 永远不要仅仅因为您认为“URL”应该是大写字母就编辑源代码,因为这会破坏程序。请停止通过编辑使问题变得更糟,特别是如果您对所涉及的编程语言并不完美。 你在积极地伤害这个社区。

标签: android android-webview webviewclient


【解决方案1】:

您正在覆盖在android N 中添加的新shouldOverrideUrlLoading 方法,

您必须重写这两种方法才能使其正常工作(旧的已弃用的方法和新的方法)

@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    final Uri uri = Uri.parse(url);
    return handleUri(uri);
}

@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    final Uri uri = request.getUrl();
    return handleUri(uri);
}

请参考this ,onPageFinished 将在页面加载完成时被调用

【讨论】:

  • 谢谢,这让 shouldOverrideUrlLoading 触发了,现在我将尝试使用它来实现我找到的建议。 onPageFinished 被调用了很多次,我的问题是找出它绝对是最后一次调用。
  • 另外我希望在 webview 中处理重定向,所以 handleUri 方法对我没有好处
【解决方案2】:

在我的情况下,WebViewClient 没有显示 webview 上是否有更改,我认为这是关于正在运行的 web 的问题。

我可以使用 OnProgressChanged 从 WebChromeClient 获取该信息,我不知道这是否会对人们有所帮助,但这里是代码:

webview.webChromeClient = object : WebChromeClient(){

        override fun onProgressChanged(view: WebView?, newProgress: Int) {
            super.onProgressChanged(view, newProgress)

            if (newProgress == 100) {
                Log.d("testing", webview.getOriginalUrl())
                Log.d("testing", webview.url)
            }
        }
    }

这样我就可以知道加载了什么以及何时完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2019-08-22
    • 2012-06-30
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多