2017-12-11 23 views
8

バインディングアダプタを使用して、リサイクラビューで画像を読み込み中です。画像は正常に表示されます。早速スクロールしながら、私はときどきピカソから「接続漏れ」のメッセージを受け取りました。Picassoバインディングアダプタ '接続がリークされました'メッセージ

問題はデッド・イメージ・リンクに由来し、すべての画像URLをハードコーディングすると、画像のすべてが画面上の最初のカップルをスクロールしてエラーを生成します。

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

コードは基本的にはto this sampleと同じです。

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要求のための接続を閉じるが、そのピカソと見に必要としている人々には、いくつかの文献を参照することができますロード・コールは1ライナーです。これがどのように漏れているのでしょうか?

+0

たぶん、あなたは新しいものを呼び出す前に、前の要求をキャンセルしなければならないとしてみてください。Picasso.with(コンテキスト).cancelRequest(ImageViewの); –

答えて

2

ピカソはネットワーク要求を処理するためにokhttp3を使用しています。ピカソのNetworkRequestHandlerクラスのコードをここに参照してください: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); 
    } 

私はピカソのプロジェクトとあまり慣れていないけど、それはレスポンスボディオブジェクトのように思えますすべての場合において閉鎖されていない。あなたはピカソのバグを発見したかもしれないし、それはあなたの活動の文脈の漏れで何かをしなければならない場合、ピカソのgithubの

+0

私はピカソで間違ったものが見つかったとは思っていませんでしたが、マーシュマローエミュレータでは問題ではないことに気付きました(問題はOreo avdで発見されました)。明日はもっと掘り下げていくつもりです:) –

0

ワイルド推測で問題を提出することをお勧めします。 ApplicationContextの

Picasso.with(imageView.context.applicationContext).load(url).into(imageView) 
関連する問題