Универсальному загрузчику изображений не хватает памяти на устройствах Samsung

Я работал с Universal Image Loader и многими устройствами (Lenovo, HTC, LG и т. д.) с моим приложением, но с Samsung все вылетает. В моем приложении у меня есть несколько фрагментов с ListView. Эти ListViews содержат только изображения, которые я загружаю из Интернета и хочу отображать с помощью UIL.

Но когда я отлаживаю свое приложение на Samsung (S4/Galaxy Tab 3/Galaxy Note 8.0), LogCat дает мне это:

07-10 14:49:33.685: E/dalvikvm-heap(29613): Out of memory on a 30355216-byte allocation.
07-10 14:49:33.705: E/AndroidRuntime(29613): FATAL EXCEPTION: main
07-10 14:49:33.705: E/AndroidRuntime(29613): Process: com.ready4s.bookapart, PID: 29613
07-10 14:49:33.705: E/AndroidRuntime(29613): android.view.InflateException: Binary XML file line #16: Error inflating class <unknown>
07-10 14:49:33.705: E/AndroidRuntime(29613):    at android.view.LayoutInflater.createView(LayoutInflater.java:626)
07-10 14:49:33.705: E/AndroidRuntime(29613):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
.
.
.
07-10 14:49:33.705: E/AndroidRuntime(29613):    at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
07-10 14:49:33.705: E/AndroidRuntime(29613):    at com.ready4s.bookapart.adapters.FavouriteAdapter.getView(FavouriteAdapter.java:101)

и приложение вылетает.

Это происходит только с устройствами Samsung! У меня никогда не было такого исключения на другой бренд. Вот как я использую UIL в своем адаптере:

private LayoutInflater mInflater;

protected ImageLoader mImageLoader = ImageLoader.getInstance();
public FavouriteAdapter(Activity activity) {

    mImageOptions = new DisplayImageOptions.Builder()
            .showImageOnLoading(R.drawable.pattern)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
            .build();
    mActivity = activity;
    mInflater = activity.getLayoutInflater();
}

///////blah blah blah

class ViewHolder {

    public ImageView mApartmentImage;

}

///////blah blah blah

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    FavouriteApart apartment = mFavouriteApartsList.get(position);
    ViewHolder vHolder;
    View view = convertView;

    if (view == null) {
        view = mInflater.inflate(R.layout.apartment_favourite_last_seen_object_row, null);
        vHolder = new ViewHolder();
        vHolder.mApartmentImage = (ImageView)view.findViewById(R.id.apartament_image_view);
        view.setTag(vHolder);
    } else
        vHolder = (ViewHolder)view.getTag();

    mImageLoader.displayImage(apartment.getURL(), vHolder.mApartmentImage, mImageOptions);

    return view;
}

и мой макет apartment_favourite_last_seen_object_row:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/search_fragment_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="@dimen/search_default_margin"
    android:descendantFocusability="blocksDescendants"
    android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >

        <ImageView
            android:id="@+id/apartament_image_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:src="@drawable/pattern" />
    </RelativeLayout>
</RelativeLayout>

Вот как я настраиваю свой универсальный загрузчик изображений:

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
            getApplicationContext()).threadPoolSize(4).memoryCache(new LruMemoryCache(2*1024*1024))
            .build();
    ImageLoader.getInstance().init(config);

Я пробовал Пикассо, и у меня была та же проблема, поэтому я не могу сказать, что у меня не хватает памяти, но, подождите, почему? Я пробовал только с DiscCache, и у меня была эта проблема, так что, возможно, все это не связано друг с другом. Вы можете помочь мне?

ОБНОВЛЕНИЕ

Я удалил изображения шаблонов из макета, и теперь у меня нет InflateException, но есть странный OutOfMemoryError. Но как это возможно, если я, например, кэширую свои изображения только на диске?

08-21 10:38:16.440: E/dalvikvm-heap(19619): Out of memory on a 4194320-byte allocation.
08-21 10:38:16.861: E/dalvikvm-heap(19619): Out of memory on a 4194320-byte allocation.
08-21 10:38:16.901: E/AndroidRuntime(19619): FATAL EXCEPTION: GLThread 31270
08-21 10:38:16.901: E/AndroidRuntime(19619): Process: com.ready4s.bookapart, PID: 19619
08-21 10:38:16.901: E/AndroidRuntime(19619): java.lang.OutOfMemoryError
08-21 10:38:16.901: E/AndroidRuntime(19619):     at android.graphics.Bitmap.nativeCreate(Native Method)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at android.graphics.Bitmap.createBitmap(Bitmap.java:903)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at android.graphics.Bitmap.createBitmap(Bitmap.java:880)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at android.graphics.Bitmap.createBitmap(Bitmap.java:847)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at opl.a(Unknown Source)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at opp.a(Unknown Source)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at opp.a(Unknown Source)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at opp.b(Unknown Source)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at oow.a(Unknown Source)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at ope.a(Unknown Source)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at okm.a(Unknown Source)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at ojx.a(Unknown Source)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at ojx.b(Unknown Source)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at otq.k(Unknown Source)
08-21 10:38:16.901: E/AndroidRuntime(19619):     at otq.run(Unknown Source)

person Roval    schedule 10.07.2014    source источник
comment
threadPoolSize(20) слишком много. 5 думаю хватит.   -  person nostra13    schedule 10.07.2014
comment
я пытался со всеми возможными вариантами, а также с 5 потоками, которые я использовал InflateExcetpion.   -  person Roval    schedule 20.08.2014


Ответы (1)


Но когда я отлаживаю свое приложение на Samsung (S4/Galaxy Tab 3/Galaxy Note 8.0), LogCat выдает мне Out of memory on a 30355216-byte allocation

Вы пытаетесь выделить ~ 30 МБ пространства в куче как часть раздувания макета. Это вряд ли сработает. Я не знаю, имеет ли это какое-то непосредственное отношение к UIL, поскольку UIL не участвует в процессе инфляции.

Вместо этого это, вероятно, исходит из @drawable/pattern, поскольку он привязан к строке № 16 макета и является единственным, что может потреблять значительный объем памяти.

person CommonsWare    schedule 20.08.2014
comment
Это что-то. Теперь у меня не InflateException, а OutOfMemoryError. Но все же, как это возможно, если я кеширую свои изображения? Я обновлю свой вопрос. - person Roval; 21.08.2014
comment
Виноват. Я изменил некоторые параметры, и теперь это работает! Шаблон был причиной проблемы. Здорово! - person Roval; 21.08.2014
comment
@Roval Могу ли я узнать, какие изменения в пшенице вы изменили ?? - person Ashton; 06.03.2017
comment
@Devon Насколько я помню, я только что удалил ссылку на эскиз изображения из XML-файла. Проблема заключалась в том, что устройство Samsung загружало миниатюру изображения в память каждый раз, когда оно отображало ячейку. - person Roval; 07.03.2017