停止在 webViewClient 中加载

Posted

技术标签:

【中文标题】停止在 webViewClient 中加载【英文标题】:stop loading in webViewClient 【发布时间】:2013-03-07 17:34:22 【问题描述】:

在我的 WebView 中,标题中有多个链接。在离线模式下,我不允许重新加载页面并保持该页面不变,然后通知用户有关互联网连接的信息。如果我单击其他链接,我可以在使用shouldOverrideUrlLoading 加载链接之前捕获链接。但是,如果我单击相同的链接,shouldOverrideUrlLoading 不会被触发,而是首先调用 onLoadResource 方法。在该方法中,我尝试了webView.stopLoading();,但它继续工作并触发onReceivedError 方法并在页面上显示错误报告。

这是我的 WebClient:

webView.setWebViewClient(new WebViewClient() 

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) 
            if(MyApplication.getInstance().isOnline()) 
                return false;
            

            Toast.makeText(getApplicationContext(), "Please check Internet connection and try again.", Toast.LENGTH_SHORT).show();
            return true;
        

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) 
            Log.i("ON_PAGE_START", "RUNNING ============>" + url);
            if (MyApplication.getInstance().isOnline()) 
                super.onPageStarted(view, url, favicon);
             else 
                webView.stopLoading();
            
        

        @Override
        public void onLoadResource(WebView view, String url)  

            if (MyApplication.getInstance().isOnline()) 
                super.onLoadResource(view, url);
             else 
                webView.stopLoading();                  
            
        

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)                

            view.stopLoading();

            Toast.makeText(getApplicationContext(), "Please check Internet connection and try again.", Toast.LENGTH_SHORT).show();
            super.onReceivedError(view, errorCode, description, failingUrl);    
        
    );

我想要的是能够确保在离线时不会触发 url 并通知它。

【问题讨论】:

【参考方案1】:

这是一个已知问题,并且报告了一个错误。 http://code.google.com/p/android/issues/detail?id=2887

已经提出了许多解决方法。例如

    Override onPageStarted Add javascriptInterface 来自 CommonsWare Disable WebView touch events

此外,注册一个 BroadcastReceiver 以监听网络状态变化,并在连接丢失时应用解决方法。 Network listener Android

【讨论】:

感谢您的出色回答。好吧,对于 1,正如您在上面的代码中看到的那样,我确实覆盖了 onPageStarted 并尝试了 stopLoading(),但没有成功。 2,我确实想过,但在我的情况下,依赖<a> 标签可能是危险,因为服务器可能会改变页面的结构。但是3rd真的让我着迷。我怎么没想到,我不知道:)。我将在下周尝试,并通知您,并可能将答案标记为已接受。 您好,我想我不能禁用触摸事件,因为我必须缓存其中一个页面并在离线模式下加载。如果我禁用触摸事件,那么我将无法加载它,还是什么?我们提出了一个具体的想法,虽然不是很好,但足以满足我们目前的需要。再次感谢 @boburShox:请分享想法 所以,我先缓存页面。如果没有互联网,我用loadDataWithBaseURL加载缓存数据,当然我会检查是否有缓存数据。一个缺点是用户可以注意到网络视图抱怨网络并加载数据。【参考方案2】:

我认为在 onLoadRessource(..) 和 onPageStarted() 中应该更进一步

view.stopLoading();

在你的 else..

【讨论】:

【参考方案3】:

我知道这是一篇相当老的帖子,但感谢这篇帖子,这帮助我解决了问题!!!

我遇到了类似的问题,stopLoading 解决了我的问题 :)

shouldOverrideUrlLoading 如果进入新页面或存在重定向但不会被调用,例如点击 iframe 等。我想在我的应用程序中实现类似的行为,我意识到 onPageStarted 被调用但不是应该OverrideUrlLoading。

我没有覆盖 onLoadResource,而只是覆盖了 onPageStarted,因为 onLoadResource 在 onPageStarted 之后被调用。 OnPageStarted 检查是否脱机并且在这种情况下不加载。希望这对某人有所帮助。

【讨论】:

以上是关于停止在 webViewClient 中加载的主要内容,如果未能解决你的问题,请参考以下文章

在 webview 中加载 URL 时面临问题

Android - 在 AsyncTask 中设置 WebViewClient 会导致 NullPointerException

Android WebView 在添加 WebViewClient 时忽略 target="_blank"

单击超链接时能够防止/停止在赛普拉斯中加载“页面加载”

在 Sencha Touch 2 中加载商店时,如何停止附加的 OPTIONS http 请求?

在Swift中加载UICollectionView时的加载器/微调器