Monday, April 30, 2018

android Retrofit 사용 시 Did you forget to close a response body? 해결 방법

Retrofit 사용 시 메모리 누수 경고 해결 방법

Retrofit을 이용해서 개발하다 보면 가끔 아래와 같은 경고 메시지를 보게 됩니다:

WARNING: A connection to https://... was leaked. Did you forget to close a response body?

이 경고는 대체로 큰 문제가 되지 않지만, 해결하지 않으면 찝찝한 기분을 남길 수 있습니다. 이 문제의 원인은 Retrofit에서 통신이 끝난 call을 자동으로 닫아주는데, 일반적인 200 OK 이외의 결과를 리턴 받으면 사용자가 직접 닫아야 하기 때문입니다.

해결 방법

사용자 정의 callback을 사용하는 경우나, Calladapter에 전달된 response에서 response.close() 혹은 response.string()(소문자 주의)를 호출하면 정상적으로 연결이 종료됩니다.

하지만 에러 발생 시에는 조금 다른 접근 방식이 필요합니다. 에러 발생 시에는 response.errorBody().string()(역시 소문자 주의)을 호출하여 에러 바디를 닫아주어야 합니다. 이렇게 하면 정상적으로 연결이 종료되며, 메모리 누수 문제도 해결할 수 있습니다.


0 개의 댓글:

Post a Comment