2017-12-11 94 views
8

Tôi đang sử dụng bộ điều hợp ràng buộc để tải hình ảnh trong chế độ xem của người tái chế. Hình ảnh xuất hiện tốt. Trong khi di chuyển nhanh, tôi nhận thấy đôi khi tôi nhận được thông báo 'rò rỉ kết nối' từ Picasso.Bộ điều hợp liên kết Picasso 'một kết nối đã bị rò rỉ' message

Sự cố xuất phát từ liên kết hình ảnh chết, mã hóa tất cả các url hình ảnh của tôi thành điểm không sinh ra lỗi cho mỗi hình ảnh sau khi cuộn cặp đầu tiên ra khỏi màn hình.

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

Mã cơ bản giống hệt 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' 

tôi có thể thấy một số tài liệu tham khảo cho người dân cần phải đóng các kết nối cho các yêu cầu tiêu chuẩn Okhttp nhưng nhìn thấy như Picasso tải cuộc gọi là một lớp lót làm thế nào điều này có thể bị rò rỉ?

+0

Có lẽ bạn nên hủy bỏ yêu cầu trước đó, trước khi gọi mới: Picasso.with (context) .cancelRequest (IMAGExem); –

Trả lời

2

Dưới mui xe Picasso đang sử dụng okhttp3 để xử lý các yêu cầu mạng của nó. Xem ở đây mã cho lớp NetworkRequestHandler Picasso: https://github.com/square/picasso/blob/0728bb1c619746001c60296d975fbc6bd92a05d2/picasso/src/main/java/com/squareup/picasso/NetworkRequestHandler.java

Có một chức năng tải để xử lý một yêu cầu 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); 
    } 

Tôi không quá quen thuộc với các dự án Picasso, nhưng nó có vẻ như đối tượng cơ thể phản ứng không bị đóng trong mọi trường hợp. Bạn có thể đã phát hiện một lỗi trong Picasso và có thể muốn nộp một vấn đề tại github picasso của

+0

Cảm ơn tôi đã nghĩ rằng nó không ít tuổi tôi đã phát hiện một cái gì đó không chính xác đi xuống trong Picasso nhưng tôi đã nhận thấy nó không phải là một vấn đề trên một giả lập Marshmallow (vấn đề đã được phát hiện trên một avo Oreo) ,. sẽ đào sâu vào ngày mai :) –

0

hoang dã đoán, nếu nó đã làm bất cứ điều gì với việc tiết lộ các bối cảnh hoạt động của bạn. Hãy thử với applicationContext

Picasso.with(imageView.context.applicationContext).load(url).into(imageView) 
Các vấn đề liên quan