Picasso - Android - OutOfMemory on loading< 4MB的图像

时间:2016-06-27 10:23:40

标签: android out-of-memory picasso

我的Android应用程序下载了一堆图像,在PagerAdapter上的5个页面上显示它们。我正在多个设备上测试它,包括6p。我一直在不断地获得OOM问题。我尝试了自定义转换来缩小图像,但看起来服务器正在返回正确大小的图像,而BitmapFactory.options上的inSampleSize结果为1,所以这没有帮助。我还必须提到,为了获得良好的用户体验,我们将在所有5个页面上加载前3个图像。因此,大约15个图像请求并且请求由毕加索很快加载,甚至可以同时请求同时请求。我使用默认的BitmapConfig。

我使用Dagger注入一个毕加索的单例实例。

@Provides
@Singleton
public Picasso providePicasso(OkHttpClient client) {
    return new Picasso.Builder(context)
            .loggingEnabled(true)
            .indicatorsEnabled(true)
            .downloader(new OkHttp3Downloader(client))
            .listener(new Picasso.Listener() {
                @Override
                public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
                    Timber.e(exception, "Failed to load image: %s", uri);
                }
            })
            .build();
}

使用的okHttpClient是:

private static OkHttpClient.Builder createOkHttpClient(Context context) {
    // Install an HTTP cache in the application cache directory.
    File cacheDir = new File(context.getCacheDir(), ShopConstants.HTTP);
    Cache cache = new Cache(cacheDir, ShopConstants.IMAGE_DISK_CACHE_SIZE);

    return new OkHttpClient.Builder()
            .cache(cache)
            .connectTimeout(ShopConstants.HTTP_TIMEOUT_VALUE, SECONDS)
            .readTimeout(ShopConstants.HTTP_TIMEOUT_VALUE, SECONDS)
            .writeTimeout(ShopConstants.HTTP_TIMEOUT_VALUE, SECONDS);
}

如果您在下面转储的统计数据中看到,从服务器下载的图像总共只有4MB。但是,缓存大小增加到24MB,总位图大小达到大约123 MB。我不明白为什么总位图大小远远大于下载图像的总大小。

===============BEGIN PICASSO STATS ===============
Memory Cache Stats
Max Cache Size: 28760941
Cache Size: 24174420
Cache % Full: 85
Cache Hits: 0
Cache Misses: 24
Network Stats
Download Count: 24
Total Download Size: 4163837
Average Download Size: 173493
Bitmap Stats
Total Bitmaps Decoded: 19
Total Bitmap Size: 122061516
Total Transformed Bitmaps: 3
Total Transformed Bitmap Size: 3202668
Average Bitmap Size: 6424290
Average Transformed Bitmap Size: 177926
===============END PICASSO STATS ===============

有人可以告诉我,如果我做错了什么。我现在能够避开OOM的唯一方法是在清单上启用“largeHeap”。

非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

Picasso占用更多内存,因为它会清除加载的图像。与毕加索相比,使用滑行将占用较低的内存,与毕加索相比,加载时间也非常少 语法:

Glide.with(context)
.load("imgpath or http link")
.into(Imgview);

依赖关系:
     编译'com.github.bumptech.glide:glide:3.5.2'