加载视图页面时出现奇怪的OutOfMemoryError

3

我创建了一个包含视图页面的活动,使用FragmentStatePagerAdapter。当启动此活动时,应用程序立即崩溃,并出现以下OutOfMemoryError错误。请帮忙指出我的错误。我花了几个小时,但找不到原因。

02-07 23:04:58.187 16037-16037/com.makeit.lite E/AndroidRuntime: Error reporting crash
java.lang.OutOfMemoryError: Failed to allocate a 34831542 byte allocation with 16765168 free bytes and 31MB until OOM
    at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
    at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:125)
    at java.lang.StringBuffer.append(StringBuffer.java:278)
    at java.io.StringWriter.write(StringWriter.java:123)
    at com.android.internal.util.FastPrintWriter.flushLocked(FastPrintWriter.java:358)
    at com.android.internal.util.FastPrintWriter.appendLocked(FastPrintWriter.java:303)
    at com.android.internal.util.FastPrintWriter.write(FastPrintWriter.java:625)
    at com.android.internal.util.FastPrintWriter.append(FastPrintWriter.java:658)
    at java.io.PrintWriter.append(PrintWriter.java:691)
    at java.io.PrintWriter.append(PrintWriter.java:687)
    at java.io.Writer.append(Writer.java:198)
    at java.lang.Throwable.printStackTrace(Throwable.java:324)
    at java.lang.Throwable.printStackTrace(Throwable.java:300)
    at android.util.Log.getStackTraceString(Log.java:343)
    at com.android.internal.os.RuntimeInit.Clog_e(RuntimeInit.java:61)
    at com.android.internal.os.RuntimeInit.-wrap0(RuntimeInit.java)
    at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:86)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)

这里是活动和视图页的源代码:

  1. 初始化视图:
fragments.add(new MonthFragment());
fragments.add(new MonthFragment());
fragments.add(new MonthFragment());
fragments.add(new MonthFragment());
fragments.add(new MonthFragment());
fragments.add(new MonthFragment());
setContentView(R.layout.activity_date_picker);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPager.setAdapter(new MonthAdapter(getSupportFragmentManager()));
  1. 适配器:
class MonthAdapter extends FragmentStatePagerAdapter {
public MonthAdapter(FragmentManager fm) { super(fm); }
@Override public Fragment getItem(int position) { return fragments.get(position); }
@Override public int getCount() { return fragments.size(); } }
  1. 空布局的片段
public class MonthFragment extends Fragment {
@Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_month, container); return view; }
@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } }
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test"/>
</LinearLayout>

2
尝试使用inflater.inflate(R.layout.fragment_month, container, false)来替换inflater.inflate(R.layout.fragment_month, container)。 - Lalit Jadav
到目前为止,我在您提供的代码中没有发现任何可能导致OOM的问题,但是您在布局中使用了高清图像吗? - Enzokie
你使用大堆大小吗? - masoud vali
哦,我的天啊。非常感谢@JadavLalit。这个错误我半天都没发现。现在它可以工作了。 - Nguyen Minh Binh
由于我在加载视图布局时犯了一个错误,导致了崩溃。我没有使用任何图像,不需要更改“offscreenpagelimit”,也不需要更改堆大小。@JadavLalit的评论很有帮助。 - Nguyen Minh Binh
显示剩余4条评论
1个回答

1
inflate调用是将新的MonthFragment添加到传入的容器中。
此外,fragments.add()也在做同样的事情。这会创建一个不正确的图形,导致内存耗尽。
使用inflater.inflate(R.layout.fragment_month, container, false);来膨胀XML,但不将其附加到视图上。这意味着fragments.add()只创建了一个片段副本,一切正常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接