2017-04-01 78 views
0

我使用onReceivedError加载webview时拦截任何错误。由于我们的网页有一个Internal Server Error和整个应用程序基于网页视图(没有本地导航),它只是看起来像这样:如何使用Android WebView处理“内部服务器错误”?

Example Screenshot

这样,我拦截错误:

@SuppressLint("NewApi") 
    public void onReceivedError(final WebView view, WebResourceRequest request, final WebResourceError error) { 
     Log.d(TAG, "HTTP error " + error.getErrorCode() + " ---> " + error.getDescription()); 
     int err = error.getErrorCode(); 
     if (err == -2) { 
      view.loadUrl("about:blank"); 
      view.loadUrl("file:///android_asset/de_offline.html"); 
     } else { 
      view.reload(); 
     } 
    } 

为什么该应用没有认出这Internal Server Error?它确认是否没有互联网连接。

但是这个错误有点破坏了整个应用程序,因为这个屏幕不会消失,即使网页返回在线。这意味着我被迫setAppCacheEnabledfalse

我想这是因为它存储在缓存中或重新加载按钮丢失。但由于我们在共享主机上,我们无法将重新加载按钮添加到此HTML错误页面。

即使我完全关闭了应用程序并重新启动,也会显示此错误。

用户的唯一选择是卸载应用程序或手动删除缓存,但我认为任何人都不会这么做,或者在大多数情况下不知道这一点。

所以我的问题是为什么onReceivedError甚至没有加载本地de_offline.html资产html页面呢?我是否必须早一些拦截,以及哪种方法或哪些方法?

回答

0

检查错误页面未使用HTTP 200状态码进行响应。服务器错误应使用HTTP-5xx状态码进行响应。 我怀疑WebView正在接收HTTP 2xx并“认为”响应正常,因此您的错误处理不会发生。

编号:List of HTTP status codes and their meaning

编辑: 我只是抬头上:WebViewClient - Error Code 从我看到这个描述完全不同的一套错误的。但为什么?

另一个编辑:哦,我的...什么? 据我所见,没有办法在WebView中获取HTTP状态代码?!这超出了我。 我所能得到的是这种解决方法How can I check from Android WebView if a page is a "404 page not found"?。适用于内部服务器错误(如果适用,请使用Android SDK API Level 23的方法,其中添加了onReceivedHttpError

+1

我明白了。所以它可能是500错误页面本身被解释为Android有效的无错页面,因为它只是有效的HTML? – Alexio

+0

这不是我的意思,错误页面可以作为一个常规服务。浏览器通过状态代码区分常规错误。状态码本身由服务器设置,由服务器决定返回的HTML是常规还是错误页面。无论如何,两者都应该是有效的HTML。 – sschrass