如何解决内存泄漏并防止我的应用程序使用碎片崩溃?

时间:2015-03-23 10:13:01

标签: java android android-fragments memory-leaks

我认为当我为我的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甚至没有加载,所以我不知道是因为没有足够的内存还是由于代码错误。因为我迷路了,请帮忙。

2 个答案:

答案 0 :(得分:0)

在适配器中执行此操作..

    @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;
}

答案 1 :(得分:0)

在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;
          }
     }
}