加载视图寻呼机时出现奇怪的 OutOfMemoryError

Posted

技术标签:

【中文标题】加载视图寻呼机时出现奇怪的 OutOfMemoryError【英文标题】:Weird OutOfMemoryError when loading view pager 【发布时间】:2017-06-25 13:53:42 【问题描述】:

我使用FragmentStatePagerAdapter 创建了一个包含视图寻呼机的活动。当使用下面的OutOfMemmoryError 启动此活动时,应用程序会立即崩溃。请帮忙指出哪个错误。我花了几个小时,但找不到自己。

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)

这里是activity和view pager的源码:

    初始化视图寻呼机:
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()));
    适配器:
类 MonthAdapter 扩展 FragmentStatePagerAdapter 公共 MonthAdapter(FragmentManager fm) 超级(调频); @覆盖 公共片段getItem(int位置) 返回片段.get(位置); @覆盖 公共 int getCount() 返回片段.size();
    具有空布局的片段
公共类 MonthFragment 扩展片段 @Nullable @覆盖 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 查看视图 = inflater.inflate(R.layout.fragment_month, 容器); 返回视图; @覆盖 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_
    android:layout_
    android:gravity="center"
    android:orientation="vertical">

    <Button
        android:layout_
        android:layout_
        android:text="test"/>
</LinearLayout>

【问题讨论】:

inflater.inflate(R.layout.fragment_month, 容器, false);试试这个而不是 inflater.inflate(R.layout.fragment_month, container); 到目前为止,我在您提供的代码中找不到任何可能导致 OOM 的内容,但您是否在布局中使用了高清图像? 你使用大堆大小吗? MonthFragment 的布局是什么? OOM 错误背后很可能存在大图像。 @Nguyen Minh Binh 尝试使用 viewPager 设置 offscreenpagelimit, 【参考方案1】:

inflate 调用正在将新的 MonthFragment 添加到传入的容器中。

fragments.add() 也在做同样的事情。这会创建不正确的图表,从而导致内存耗尽。

使用inflater.inflate(R.layout.fragment_month, container, false); 膨胀xml,但不将其附加到视图。这意味着 Fragments.add() 只创建一个片段副本,一切正常。

【讨论】:

以上是关于加载视图寻呼机时出现奇怪的 OutOfMemoryError的主要内容,如果未能解决你的问题,请参考以下文章

Fragment中的ViewPager,只有选项卡才能在第一个视图上加载选项卡

ListFragments 错误的数据奇怪的寻呼机

SwiftUI动画视图出现在ZStack中时出现奇怪的过渡

ajax 页面加载视图页面的 ajax 寻呼机由 ajax

加载数据后如何防止滚动视图滚动到网络视图?

Volley 首次加载活动时显示空错误