2016-06-27 1 views
-1

Мое приложение для Android загружает кучу изображений, чтобы отображать их на 5 страницах на PagerAdapter. Я тестирую его на нескольких устройствах, включая 6p. Я постоянно получаю проблему OOM. Я попробовал настраиваемое преобразование, чтобы уменьшить изображение, но выглядит, что сервер возвращает правильные изображения размеров, а inSampleSize на BitmapFactory.options получается 1, так что это не помогло. Я также должен упомянуть, что для хорошего пользовательского интерфейса мы загружаем первые 3 изображения на все 5 страниц. Таким образом, приблизительно 15 запросов изображения и запрошенные для загрузки picasso довольно быстро, могут даже запрашиваться одновременно одновременно. Я использую BitmapConfig по умолчанию.Picasso - Android - OutOfMemory при загрузке <4MB изображений

И я использую Кинжал для инъекции одного экземпляра пикассо.

@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 изображений, которые загружаются с сервера. Однако размер кеша увеличивается до 24 МБ, а общий размер растрового изображения составляет около 123 МБ. Я не понимаю, почему общий размер растрового изображения намного больше, чем общий размер загруженных изображений.

===============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».

Большое спасибо заранее за помощь

+0

потому что Bitmap всегда принимает W * H * 4 (для ARGB_8888) ... загруженный размер COMPRESSED не имеет значения – Selvin

+0

Попробуйте использовать опцию crop, доступную в Picasso. http://stackoverflow.com/questions/30011106/download-image-and-resize-to-avoid-oom-errors-picasso-fit-distorts-image – Ajit

ответ

0

Пикассо занимает больше памяти, потому что она очистит загруженное изображение. Использование глиссады будет занимать меньшую память по сравнению с Picasso и временем загрузки также очень меньше по сравнению с Picasso.
Синтаксис:

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

зависимостей:
компиляции 'com.github.bumptech.glide: глиссады: 3.5.2'