2014-09-04 90 views
24

我的佈局中有一個webview。默認情況下,將在其中打開搜索表單。在搜索時,搜索表單下方會顯示一個列表部分。如果點擊列表中的任何鏈接,則打開詳細信息頁面。現在我想控制webview的後退導航。我將這段代碼放在Activity中。Android 4.4在WebView中給onReceivedError返回ERR_CACHE_MISS錯誤返回

@Override 
     public boolean onKeyDown(int keyCode, KeyEvent event) { 

      Log.d("TYPE", TYPE); 

      WebView myWebView = null; 
      if (TYPE.equalsIgnoreCase("REPORT_ACTIVITY")) 
       myWebView = reportView; 

      if (TYPE.equalsIgnoreCase("FEEDBACK_ACTIVITY")) 
       myWebView = feedbackView; 

      if (myWebView != null) 
       // Check if the key event was the Back button and if there's history 
       if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) { 
        myWebView.goBack(); 
        return true; 
       } 
      // If it wasn't the Back key or there's no web page history, bubble up 
      // to the default 
      // system behavior (probably exit the activity) 
      return super.onKeyDown(keyCode, event); 
     } 

private WebViewClient webViewClient = new WebViewClient() { 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      Log.d("onPageStarted", "onPageStarted"); 
      loadProgressBarBox.setVisibility(View.VISIBLE); 
      //view.setVisibility(View.GONE); 
     } 

     public void onPageFinished(WebView view, String url) { 
      Log.d("onPageFinished", "onPageFinished"); 
      loadProgressBarBox.setVisibility(View.GONE); 
     } 

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

      Log.d("Error", "Error code: " + errorCode + "/" + description); 
     } 

} 

我也用WebView設置了WebViewClient。當我回去使用後退按鈕時,它對於任何4.4版本都可以正常工作。但是,當我在Android 4.4中嘗試時,它會從細節頁面恢復到列表頁面。但只要我想再次回來,它的描述中的錯誤代碼爲-1和ERR_CACHE_MISS。沒有頁面顯示。

09-04 06:59:05.666: D/Error(1102): Error code: -1/net::ERR_CACHE_MISS 

如何在Android 4.4中解決這個問題?

回答

56

在大多數情況下,這個錯誤實際上源於您的應用程序之外(偶爾它只是缺少INTERNET權限,但這聽起來不像這裏的情況)。

我輸入了一個解釋,但發現一個更簡單的例子,作爲this answer to another question解釋雙打。以下是相關的位,重新散列一點:

  1. 喬在訂單填滿了他的信用卡信息
  2. 服務器處理這些信息,並返回在頭部標有no-cache確認/收據頁面,這意味着它將始終從服務器請求。
  3. Joe轉到另一頁。
  4. Joe點擊返回,因爲他想再次檢查某些內容,並將其帶到確認頁面。

問題出現在最後一步。確認頁面標有no-cache,所以必須再次從服務器請求。但要正確顯示相同的頁面,首次傳送的相同數據需要重新發送。

這會導致Joe收到兩次帳單,因爲正在使用與上次相同的信息發出新請求。當喬在自己的賬戶上發現兩項指控並在他家門口附加一對帳篷時,喬不會成爲快樂的露營者。

看來,這種情況已經足夠普遍,現在它已成爲大多數瀏覽器的標準錯誤,顯然,Android的更新版本。這個錯誤實際上源於Chromium,這就是爲什麼你會在Google Chrome中看到同樣的錯誤,以及爲什麼你只能在4.4中看到它(它引入了新版本的WebView based on Chromium)。

事實上,您之前可能已經看到過,這是大多數瀏覽器中顯示的消息,警告您沿着「刷新此頁面,瀏覽器將不得不重新發送數據...」亞達」。

這是Android 4.4的方式警告你正在發生的事情。如何解決這個問題真的取決於你連接的是什麼,但是如果你搜索這種情況,你會發現它很常見,並且有修復程序。確切的錯誤觸發實際上是當請求無法從緩存服務的時候(在這種情況下,no-cache正在造成這種情況)。

根據請求的性質,可能no-cache實際上並不需要。

但是從您的應用程序的角度來看,主要問題是,onReceiveError是WebView的一種「最後的手段」。你到達的錯誤已經從底層系統傳播。一旦你到達那裏,你不能繼續頁面加載,因爲它代表。所以你沒有機會允許重新發送,並且你不能給用戶這個選擇,不像谷歌瀏覽器那樣。

10

使用

if (Build.VERSION.SDK_INT >= 19) { 
     mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 
    } 

它將在WebView中修復ERR_CACHE_MISS。 也許你需要在一些Lollipop WebView更新後將其更改爲SDK_INT == 19,但它現在可行。

+0

這對我很好用 – craigrs84 2015-04-01 18:18:21

+1

我結束了使用LOAD_NO_CACHE而不是LOAD_CACHE_ELSE_NETWORK。同樣的概念,但LOAD_CACHE_ELSE_NETWORK表示它使用緩存的資源,即使它們已過期,這對我來說聽起來不太合適。 – craigrs84 2015-04-01 18:41:07

27

我遇到同樣的問題,因爲在我的清單文件夾中,我有上網權限資本:

我有(錯誤)

<uses-permission android:name="ANDROID.PERMISSION.INTERNET"/> 

應該有(沒有錯誤)

<uses-permission android:name="android.permission.INTERNET"/> 
+0

這將刪除錯誤消息,但這很奇怪,因爲Studio中的AutoComplete使用UC就像第一個示例一樣。 – 2015-08-08 14:45:13

+0

同樣在這裏,Studio非常奇怪的行爲。 – wzieba 2015-08-08 22:36:05

0

您的andriodManifest.xml文件中的此權限

<uses-permission android:name="android.permission.INTERNET"/>