【问题标题】:Universal Image Loader gets out of memory with Samsung devices通用图像加载器在三星设备上内存不足
【发布时间】:2014-08-31 23:08:42
【问题描述】:

我一直在使用 Universal Image Loader 和许多设备(联想、HTC、LG 等)使用我的应用程序,但使用三星时一切都崩溃了。在我的应用程序中,我有几个带有 ListView 的碎片。这些 ListView 仅包含我从网络下载并希望通过 UIL 显示的图像。

但是当我在三星 (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)

应用程序崩溃。

这只发生在三星设备上!我从来没有在另一个品牌上遇到过这种例外。 这就是我在适配器中使用 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)

【问题讨论】:

  • threadPoolSize(20) 太多了。我认为 5 就足够了。
  • 我一直在尝试所有可能的选项,但我也尝试了 5 个线程 InflateExcetpion。

标签: android caching universal-image-loader inflate-exception


【解决方案1】:

但是当我在三星(S4/Galaxy Tab 3/Galaxy Note 8.0)上调试我的应用程序时,LogCat 给了我Out of memory on a 30355216-byte allocation

您正在尝试分配 ~30MB 的堆空间作为扩展布局的一部分。这不太可能奏效。我不知道它与 UIL 有任何直接关系,因为 UIL 不参与通货膨胀过程。

相反,这可能来自@drawable/pattern,因为它与布局的第 16 行相关联,并且是其中唯一可能消耗大量内存的东西。

【讨论】:

  • 就是这样。现在我没有 InflateException 但 OutOfMemoryError。但是,如果我缓存我的图像怎么可能?我会更新我的问题。
  • 我的错。我已经更改了一些选项,现在它正在工作!模式是问题的根源。太好了!
  • @Roval 我可以知道你改变了小麦变化吗??
  • @Devon 据我所知,我刚刚从 XML 文件中删除了缩略图引用。问题是三星设备每次显示单元格时都会将缩略图加载到内存中。
猜你喜欢
  • 2016-07-19
  • 2014-08-12
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
相关资源
最近更新 更多