java.lang.OutOfMemoryError:分配失败

时间:2017-01-02 03:53:31

标签: java android android-fragments

所以我用viewPager做了一个活动,好吧,一旦viewPager.setAdapter工作就崩溃了。这是崩溃日志。

java.lang.OutOfMemoryError: Failed to allocate a 26488162 byte allocation with 16777216 free bytes and 24MB until OOM
                  at java.lang.StringFactory.newStringFromChars(Native Method)
                  at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:629)
                  at java.lang.StringBuffer.toString(StringBuffer.java:723)
                  at java.io.StringWriter.toString(StringWriter.java:100)
                  at android.util.Log.getStackTraceString(Log.java:345)
                  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)

这是活动的课程

public class SetupActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setup);
        ViewPager setupPager = (ViewPager) findViewById(R.id.setupViewpager); 
        SetupPagerAdapter setupPagerAdapter = new SetupPagerAdapter(getSupportFragmentManager());    
        setupPager.setAdapter(setupPagerAdapter);
   }
}

这里是SetupPagerAdapter

public class SetupPagerAdapter extends FragmentPagerAdapter {
    public SetupPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        if(position == 0){
            return new SetupFragmentOne().newInstance();
        }
        return null;
    }

    @Override
    public int getCount() {
        return 1;
    }
}

以及此处SetupFragmentOne

public class SetupFragmentOne extends Fragment {
    public SetupFragmentOne newInstance() {
        SetupFragmentOne fragment = new SetupFragmentOne();
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.setup_fragment_1, container);
        Typeface typeface = Typeface.createFromAsset(getContext().getAssets(),"coolvetica_rg.ttf");
        TextView tv = (TextView) view.findViewById(R.id.setupText1);
        tv.setTypeface(typeface);
        return view;
    }
}

1 个答案:

答案 0 :(得分:4)

在清单文件中尝试:

<application
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">

当Java虚拟机(JVM)由于内存空间不足而无法分配对象时,会发生此错误,并且垃圾收集器无法释放一些空间。

尝试更改此行:

View view = inflater.inflate(R.layout.setup_fragment_1, container);

View view = inflater.inflate(R.layout.setup_fragment_1, container,false);

解决内存不足错误...更好的方法:

如果您使用大量位图或可绘制图像......您应该将不同分辨率的图像放在不同的文件夹中...... hdpi,xhdpi等... 看到这个:https://developer.android.com/guide/practices/screens_support.html

当活动被破坏时也取消绑定你的drawables所以垃圾收集器可以释放内存

 private void unbindDrawables(View view)
{
        if (view.getBackground() != null)
        {
                view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup && !(view instanceof AdapterView))
        {
                for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++)
                {
                        unbindDrawables(((ViewGroup) view).getChildAt(i));
                }
                ((ViewGroup) view).removeAllViews();
        }
}

另见:https://androidactivity.wordpress.com/2011/09/24/solution-for-outofmemoryerror-bitmap-size-exceeds-vm-budget/