Адаптер связывания Пикассо «сообщение было утечено»

Я использую адаптер привязки для загрузки изображений в виде ресайклера. Изображения выглядят отлично. В то время как быстрая прокрутка я заметил, иногда я получал сообщение «соединение просочился» от Пикассо.

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

W/OkHttpClient: A connection to https://s3-eu-west-1.amazonaws.com/ was leaked. Did you forget to close a response body? 

Код в основном идентичен этому образцу .

BindingUtils.kt

 object BindingUtils { @BindingAdapter("imageUrl") @JvmStatic fun setImageUrl(imageView: ImageView, url: String) { Picasso.with(imageView.context).load(url).into(imageView) } 

XML

 <ImageView android:id="@+id/imageview_merchant_background" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/primary" android:scaleType="centerCrop" app:imageUrl="@{viewModel.background}"/> 

Gradle

 implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofitVersion" implementation "com.squareup.retrofit2:adapter-rxjava2:$rootProject.retrofitVersion" implementation "com.squareup.retrofit2:converter-gson:$rootProject.retrofitVersion" implementation "com.squareup.okhttp3:logging-interceptor:$rootProject.okhttpLoggingVersion" implementation "com.squareup.picasso:picasso:$rootProject.picassoVersion" retrofitVersion = '2.3.0' okhttpLoggingVersion = '3.6.0' picassoVersion = '2.5.2' 

Я могу видеть несколько ссылок на людей, которые нуждаются в закрытии соединений для стандартных запросов Okhttp, но видя, что этот вызов загрузки Picasso является однострочным, как это может протекать?

    Под капотом Picasso использует okhttp3 для обработки своих сетевых запросов. См. Здесь код для класса NetworkRequestHandler Picasso: https://github.com/square/picasso/blob/0728bb1c619746001c60296d975fbc6bd92a05d2/picasso/src/main/java/com/squareup/picasso/NetworkRequestHandler.java

    Существует функция загрузки, которая обрабатывает запрос okhttp:

     @Override public Result load(Request request, int networkPolicy) throws IOException { okhttp3.Request downloaderRequest = createRequest(request, networkPolicy); Response response = downloader.load(downloaderRequest); ResponseBody body = response.body(); if (!response.isSuccessful()) { body.close(); throw new ResponseException(response.code(), request.networkPolicy); } // Cache response is only null when the response comes fully from the network. Both completely // cached and conditionally cached responses will have a non-null cache response. Picasso.LoadedFrom loadedFrom = response.cacheResponse() == null ? NETWORK : DISK; // Sometimes response content length is zero when requests are being replayed. Haven't found // root cause to this but retrying the request seems safe to do so. if (loadedFrom == DISK && body.contentLength() == 0) { body.close(); throw new ContentLengthException("Received response with 0 content-length header."); } if (loadedFrom == NETWORK && body.contentLength() > 0) { stats.dispatchDownloadFinished(body.contentLength()); } InputStream is = body.byteStream(); return new Result(is, loadedFrom); } 

    Я не слишком хорошо знаком с проектом Пикассо, но кажется, что тело тела ответа не закрыто во всех случаях. Возможно, вы заметили ошибку в Picasso и можете захотеть записать проблему в github picasso

    Дикая догадка , если она должна что-то сделать с утечкой контекста вашей деятельности. Попробуйте использовать applicationContext

     Picasso.with(imageView.context.applicationContext).load(url).into(imageView)