2017-04-01 80 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