【问题标题】:Getting OutOfMemoryError on CircularImageView在 CircularImageView 上出现 OutOfMemoryError
【发布时间】:2014-05-28 14:27:46
【问题描述】:

我正在使用课程posted on StackOverflow

我刚刚遇到了 OutOfMemoryError:

提供 StackTrace:

android.view.InflateException:二进制 XML 文件第 15 行:错误 膨胀类 android.view.LayoutInflater.createView(LayoutInflater.java:626) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:761) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:498) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:398) 在 com.flunny.fragments.amici.TrovaAmiciFragment$TrovaAmiciAdapter.getView(TrovaAmiciFragment.java:158) 在 android.widget.AbsListView.obtainView(AbsListView.java:2608) 在 android.widget.ListView.makeAndAddView(ListView.java:1852) 在 android.widget.ListView.fillDown(ListView.java:682) 在 android.widget.ListView.fillGap(ListView.java:646) 在 android.widget.AbsListView.trackMotionScroll(AbsListView.java:6592) 在 android.widget.AbsListView$FlingRunnable.run(AbsListView.java:5575) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:791) 在 android.view.Choreographer.doCallbacks(Choreographer.java:591) 在 android.view.Choreographer.doFrame(Choreographer.java:560) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777) 在 android.os.Handler.handleCallback(Handler.java:730) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:176) 在 android.app.ActivityThread.main(ActivityThread.java:5419) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:525) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 在 dalvik.system.NativeStart.main(Native Method) 原因: java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Constructor.constructNative(Native Method) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:417) 在 android.view.LayoutInflater.createView(LayoutInflater.java:600) ... 25 更多原因:java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596) 在 android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444) 在 android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:832) 在 android.content.res.Resources.loadDrawable(Resources.java:2988) 在 android.content.res.TypedArray.getDrawable(TypedArray.java:602) 在 android.widget.ImageView.(ImageView.java:131) 在 com.flunny.resources.CircularImageView.(CircularImageView.java:33) 在 com.flunny.resources.CircularImageView.(CircularImageView.java:29) ... 还有 28 个

XML #15 是:

 <com.flunny.resources.CircularImageView
     android:id="@+id/circularImageView1"
     android:layout_width="@dimen/trovaAmiciImmagineAltezza"
     android:layout_height="@dimen/trovaAmiciImmagineAltezza"
     android:layout_centerVertical="true"
     android:src="@drawable/sconosciuto" />

CircularImageView #33 和 #29:

public CircularImageView(Context context, AttributeSet attrs) {
    this(context, attrs, R.attr.circularImageViewStyle); // 29
}

public CircularImageView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle); // 33
................

图像未设置,它之前(或没有?)崩溃。 默认图像 (@drawable/sconosciuto) 有 2,9kb (111px x 111px)。

其余图片由ImageLoader加载但不超过20kb

提前致谢。

【问题讨论】:

  • 你在使用示例代码吗>
  • 磁盘大小无关紧要。重要的是图片的宽度和高度。位图需要 width*height*4 字节存储在内存中。
  • @blackbelt (111px x 111px),我不习惯加载超过 500px 宽度的图片
  • 是不是因为包名。您需要在 xml com.flunny.fragments.amici 和 com.flunny.resources.CircularImageView 中提供完整的包名称

标签: android android-layout out-of-memory universal-image-loader


【解决方案1】:

可能你正在使用列表视图并且你正在一次又一次地初始化你的图像视图

public View getView(int position, View convertView, ViewGroup parent) {

        View listitem = convertView;
        int pos = position;

        if (convertView == null) {
            /** Inflating the List Item below */

            /** Getting the Image View of Listitem below */
            textOfRank = (TextView) listitem
                    .findViewById(R.id.textview_of_Rank);
            textOfErrors = (TextView) listitem
                    .findViewById(R.id.textview_of_Errors);
            textOfMode = (TextView) listitem
                    .findViewById(R.id.textview_of_Mode);
            textOfTime = (TextView) listitem
                    .findViewById(R.id.textview_of_Time);

        }
}

如果我没有错,那么只需在适配器类中初始化一次图像视图或任何东西,谢谢你可能会对你有所帮助

【讨论】:

  • 我认为这是问题所在,看来您的列表视图在填充堆时存在问题。调查这部分代码
  • 嗨,是的,我需要重新加载它,因为状态改变了(想象一下Facebook的好友请求:我接受,它正在加载,“你是朋友”,所以我每次都需要加载它。应该那我呢?
【解决方案2】:

应用程序在创建过程中会提供堆大小的内存。您收到内存不足错误,因为您的堆大小超出了系统提供的大小。为避免这种情况,您需要缩放图像(更改加载到内存中的位图大小),然后对其进行操作。请注意,位图比加载它们的文件消耗更多的内存,因为在文件系统中它们被压缩但在 ram 中它们不是。或者不是一个好的做法,但您可以通过 android:largeHeap="true" 请求更大的堆大小为 true。

【讨论】:

  • 对不起,这似乎是复制粘贴回复。我说它有一个小尺寸(111x111 px
  • 这不是复制粘贴回复,我可以向您保证,但我正忙于查看您的堆栈跟踪并被带走将再次查看它
猜你喜欢
  • 1970-01-01
  • 2015-08-09
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
相关资源
最近更新 更多