2016-01-22 84 views
4

我試圖攔截來自WebView的請求,以便我可以注入額外的標頭。我正在將WebViewClient應用於WebView並覆蓋shouldInterceptRequest()如何處理WebExceptionClient.shouldInterceptRequest()中的IOException

shouldInterceptRequest()我打開連接,添加標題,然後在WebResourceResponse中返回打開的流。

我不清楚如果初始打開連接失敗時應如何處理IOException。

final Map<String, String> extraHeaders = getExtraHeaders(intent); 
webview.setWebViewClient(new WebViewClient() { 
    @Override 
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { 
     final Uri uri = request.getUrl(); 

     try { 
      URL   url = new URL(uri.toString()); 
      URLConnection con = url.openConnection(); 
      for (Map.Entry<String, String> h : extraHeaders.entrySet()) { 
       con.addRequestProperty(h.getKey(), h.getValue()); 
      } 
      final String contentType = con.getContentType().split(";")[0]; 
      final String encoding = con.getContentEncoding(); 
      return new WebResourceResponse(contentType, encoding, con.getInputStream()); 
     } catch (IOException e) { 
      // what should we do now? 
      e.printStackTrace(); 
     } 

     return super.shouldInterceptRequest(view, request); 
    } 
}); 

我不能離開它未捕獲的,因爲它是一個檢查異常,是不是shouldInterceptRequest()簽名的一部分。

我無法將其包裝在一個未經檢查的異常中,因爲那樣會被WebView取消並殺死應用程序。

如果我發現並忽略異常,並且默認爲super方法(它剛剛返回null),那麼WebView將繼續其默認行爲並嘗試發送請求(沒有我的額外頭文件)。這是不可取的,因爲WebView自己的連接嘗試可能實際上取得成功,並且缺失的標題會導致更多問題。

似乎沒有辦法表明攔截失敗,請求應該中止。

這裏做的最好的事情是什麼?


我試圖返回一個模擬失敗響應,但這不被視爲錯誤。 WebView將顯示包含響應內容的頁面(來自異常的錯誤消息),並且不調用WebViewClient的回調函數onReceivedError()onReceivedHttpError()回調。

} catch (IOException e) { 
    InputStream is = new ByteArrayInputStream(e.getMessage().getBytes()); 
    return new WebResourceResponse("text/plain", "UTF-8", 500, "Intercept failed", 
            Collections.<String, String>emptyMap(), 
            is); 
} 

回答

-1

表示發生了某種I/O異常。該類是由失敗或中斷的I/O操作產生的常規異常類。

IOException() 構造一個IOException,其空錯誤細節消息爲null。

IOException(String message) 構造一個帶有指定詳細消息的IOException。

IOException(String message,Throwable cause) 構造一個具有指定詳細消息和原因的IOException。

IOException異常(Throwable的原因) 構造一個IOException與指定的原因和詳細消息(原因== NULL NULL:?cause.toString())(其TY pically包含cause的類和詳細消息) 。

你有IOException異常

這裏的例子:

http://examples.javacodegeeks.com/core-java/io/ioexception/java-io-ioexception-how-to-solve-ioexception/

+0

這不回答問題。我知道什麼是IOException。 –

1

你可以嘗試實例化一個新的WebResourceError,然後調用WebViewClient.onReceivedError。從未嘗試過這樣的事情,但是這是它會是什麼樣子:

} catch (final IOException e) { 
    WebResourceError wre = new WebResourceError(){ 
     @Override 
     public CharSequence getDescription(){ 
      return e.toString(); 
     } 

     @Override 
     public int getErrorCode(){ 
      return WebViewClient.ERROR_CONNECT; 
     } 
    }; 

    onReceivedError(view, request, wre); 

    return true; 
} 

還有一個deprecated version of onReceivedError如果你不想讓你可以使用或不能實例化一個WebResourceError