[英]How to prevent my app from crashing when there is no input or if input is invalid
[英]How can I resolve memory leaks and prevent my app from crashing using fragments?
我认为我在Android应用程序中使用片段时会发生内存泄漏,因为当我添加更多片段时,应用程序会崩溃,每个新片段都会打开内存峰值。 我该如何解决? 我对片段还很陌生,并且我已经使用了很多资源来适当地使用...。 随着片段的不断变化,堆不断增长,导致内存泄漏。
这是我的MainActivity.java
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
public class MainActivity extends FragmentActivity {
ViewPager viewpager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewpager = (ViewPager) findViewById(R.id.pager);
PagerAdapter padapter = new PagerAdapter(getSupportFragmentManager());
viewpager.setAdapter(padapter);
}
}
这是我的PagerAdapter.java
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class PagerAdapter extends FragmentPagerAdapter {
public PagerAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
switch (arg0) {
case 0:
return new FragmentOne();
case 1:
return new FragmentTwo();
case 2:
return new FragmentThree();
case 3:
return new FragmentFour();
case 4:
return new FragmentFive();
default:
break;
}
return null;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 5;
}
}
给定上面的代码,当我切换到片段4或5时,我保留为先前的片段分配的先前的内存,因此应用程序的内存级别不受控制地达到峰值,并且应用程序开始滞后。 片段5甚至没有加载,所以我不知道那是因为没有足够的内存还是由于代码错误。 请帮助,因为我迷路了。
在适配器中执行此操作。
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
Fragment fragment = null;
switch (arg0) {
case 0:
fragment = new FragmentOne();
case 1:
fragment = new FragmentTwo();
case 2:
fragment = new FragmentThree();
case 3:
fragment = new FragmentFour();
case 4:
fragment = new FragmentFive();
default:
break;
}
return fragment;
}
像Sjd提供的解决方案一样,仅将局部片段变量声明为null不会帮助内存优化。
如果您有很多碎片将占用大量内存,则应使用FragmentStatePagerAdapter ,这意味着一旦移至另一个碎片 ,一个碎片将被销毁。 如果没有那么多片段,则可以简单地使用FragmentPagerAdapter来将片段保留在内存中。
因此,您的PagerAdapter.java实现必须进行如下修改:
public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 5;
}
@Override
public Fragment getItem(int position) {
switch (arg0) {
case 0:
return new FragmentOne();
case 1:
return new FragmentTwo();
case 2:
return new FragmentThree();
case 3:
return new FragmentFour();
case 4:
return new FragmentFive();
default:
break;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.