2017-01-02 94 views
3

因此,我使用viewPager进行了一个活动,并且在viewPager.setAdapter工作后立即崩溃。这是崩溃日志。java.lang.OutOfMemoryError:未能分配

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; 
    } 
} 
+0

你需要弄清楚为什么你的应用程序使用这么多的内存。你有很多大图片吗?你有没有内存泄漏?这些是你需要跟踪并修复的东西。 –

回答

4

在manifest文件试试这个:

<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

而且拆散你的可绘制时destroyed..so内存活性可通过垃圾收集器

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/

+0

现在它给我'android.os.TransactionTooLargeException:数据宗地大小' – Ahmad

+1

@Ahmad尝试编辑.. – rafsanahmad007

+1

解决此问题的更好方法不要在您的应用程序中使用大尺寸图像,或将图像放入正确的选定文件夹中到android中的可绘制文件夹。 –

相关问题