Как решить проблему утечки памяти в модификации Android? - PullRequest
0 голосов
/ 02 января 2019

Я столкнулся с этой проблемой в одном из моих существующих приложений для 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...