2015-09-21 3 views
2

я переопределить следующую функцию, чтобы сделать кэш себя (для обходного сетевого поиска)Должен ли я закрывать HttpURLConnection в android?

public WebResourceResponse shouldInterceptRequest(WebView view, String url) { 
    // depending on android version, I use the below function 
    // public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { 

    HttpURLConnection urlConnection = null; 
    try { 
     urlConnection = (HttpURLConnection) url.openConnection(); 

     in = new BufferedInputStream(urlConnection.getInputStream()); 
     data = new String(ByteStreams.toByteArray(in)); 

    } catch (Exception e) { 
     return null; 
    } 

    // do stuff with data but omitted here 

    return new WebResourceResponse(mimeType, "UTF-8", in); 

} 

Я не закрывающий URLConnection, потому что я пропусканием InputStream, который привязан к URLConnection.

Поскольку это распространенная идиома, что если вы open что-то, вы должны close это, я беспокоюсь, если я в порядке с кодом.

Do I need to call HttpURLConnection.disconnect after finish using it обсуждает это, но я не мог получить окончательный ответ там, разрешено ли нам not close.

+0

Как о копировании InputStream из URLConnection в другой поток, который будет использоваться для создания WebResourceResponse, то вы можете отключить URLConnection ? – BNK

ответ

0

Как только тело ответа было прочитано, соединение HttpURLC должно быть закрыто вызовом функции disconnect(). Отключение освобождает ресурсы, удерживаемые соединением, поэтому они могут быть закрыты или повторно использованы.

URL url = new URL("http://www.android.com/"); 
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
    try { 
    InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
    readStream(in); 
    finally { 
    urlConnection.disconnect(); 
    } 
} 

вы можете прочитать Пользы класса следуют образцу из here

EDIT: Посмотрите here более

+1

Конструктор WebResourceResponse требует inputStream, а входной поток привязан к соединению. – eugene

+0

Могу я узнать, что вы имеете в виду? – Sree

+0

in = new BufferedInputStream (urlConnection.getInputStream()); вернуть новый WebResourceResponse (mimeType, «UTF-8», in); Вы видите 'in' от' urlConnection', и я возвращаю WebResourceResponse, у которого есть 'in' – eugene

0

Вы можете сделать что-то вроде этого, прежде чем вернуться в ответ:

final HttpURLConnection connection1 = connection; 
in = new BufferedInputStream(connection.getInputStream()){ 
    @Override 
    public void close() throws IOException { 
     super.close(); 
     if (connection1 != null) { 
      connection1.disconnect(); 
     } 
    } 
}; 
0

Возможно, немного поздно, но я думаю, это то, что лет ты хочешь. Просто сделайте все закрывающиеся глобальные и закройте их в onPageFinished.

private class WebViewClientExtends extends WebViewClient { 

    // For me it is a inputStream 
    // You can define your HttpURLConnection here 
    FileInputStream fileInputStream; 

    // Your code here 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); 

     // Same I close my inputStream here 
     // You can close your HttpURLConnection here 
     if(fileInputStream == null) return; 
     try { 
      fileInputStream.close(); 
     } catch (Exception ignore) { 
     } 
    } 
} 

Установите наш собственный класс в WebView, то это делается:

webView.setWebViewClient(new WebViewClientExtends()); 
Смежные вопросы