Я столкнулся с этой проблемой в одном из моих существующих приложений для Android
A connection to myapicall was leaked. Did you forget to close a response body?
Я использовал эти версии retrofit
и OkHttp
в моем существующем приложении для Android, и я обнаружил в logcat, что есть много утечек памяти, когда он говорит: «Вы забыли закрыть OkHttp, так как у него есть утечки памяти. .
// ok http
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
//for body in retrofit
implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.3.1'
// for retro fit
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
// if you are using proguard follow this link
//http://square.github.io/retrofit/
// for rxjava
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
Я обнаружил, что некоторые из сообщений предполагают, что обновленная версия okhttp и retrofit будет автоматически обрабатывать утечки памяти, а некоторые сообщений предполагают, что мне нужно использовать try{}finally{ response.body().close();}
, но я иметь ответ в общем типе <T>
, поэтому я не смогу получить доступ к методу .close()
вообще. Так как я смог использовать для доступа body().rawResponse().close()
:
public void refreshRemoteAcademicCalendar(int skip, int top, String type) {
Call<AcademicCalendarModel.AcademicCalendarMetaData> request = academicCalendarService.getEventsAcademicCalendar(skip, top, "Type eq '" + type + "'");
academicCalendarService.getEventsAcademicCalendar(skip, top, "Type eq '" + type + "'").enqueue(new Callback<AcademicCalendarModel.AcademicCalendarMetaData>() {
@Override
public void onResponse(Call<AcademicCalendarModel.AcademicCalendarMetaData> call, Response<AcademicCalendarModel.AcademicCalendarMetaData> response) {
try {
if (response.isSuccessful()) {
List<AcademicCalendarModel> results = response.body().getValue();
for (AcademicCalendarModel academicCalendar : results) {
saveDataToDatabase(academicCalendar);
}
}
}finally {
response.raw().body().close();
}
}
@Override
public void onFailure(Call<AcademicCalendarModel.AcademicCalendarMetaData> call, Throwable t) {
}
});
}
, что приводит к другой проблеме:
java.lang.IllegalStateException: Cannot read the raw response body of a converted body.
at retrofit2.OkHttpCall$NoContentResponseBody.source(OkHttpCall.java:267)
at okhttp3.ResponseBody.close(ResponseBody.java:187)