2015-08-18 11 views
7

Ho un SDK Android che utilizza OkHttp. Nella mia app di esempio che utilizza il mio SDK, tutto funziona correttamente. Uno dei miei utenti, tuttavia, quando StrictMode è attivato, riceve il seguente java.lang.Throwable: Explicit termination method 'close' not called. Ho provato a replicarlo nella mia app con StrictMode e non ho ricevuto questo errore.Quando chiamare response.body(). Close()

Capisco che dovrei chiamare response.body().close() ma sono ancora un po 'confuso sul motivo per cui questo non sta accadendo nella mia app. La traccia dello stack che mi ha inviato ha solo le mie classi, quindi non sembra che nulla nel suo codice lo stia causando.

Si noti inoltre che solo una delle richieste del mio SDK ha effettivamente la risposta in lettura. Ma questa non è la richiesta che il mio utente dice sta causando l'eccezione.

C'è qualcos'altro che potrebbe causare questo?

Quando devo chiamare .close()? Si consiglia di chiamare immediatamente dopo aver chiamato execute()? Chiudendo il corpo potrebbe impedirne la lettura in futuro?

risposta

8

È necessario chiamare sempre close(). Da OkHttp's source:

Il chiamante può leggere il corpo della risposta con il metodo Response.body() della risposta. Per facilitare il riciclo della connessione, i chiamanti devono sempre chiudere il corpo della risposta.

Probabilmente dovresti chiamare close() non appena hai finito di ottenere ciò che ti serve dalla risposta. Memorizzarlo in una variabile, quindi chiudere lo ResponseBody.

+2

Quasi sempre - 'string()' e 'bytes()' si chiudono –

+1

@ItaiHanski, sei sicuro? Non ho trovato alcuna prova nel codice. –

+2

@AleksandarStojadinovic Sì. Controlla la documentazione su ['ResponseBody'] (https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/ResponseBody.java#L51). Ogni metodo è richiesto per chiamare 'close()' tranne per 'string()' e 'bytes()' –