Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决内存泄漏问题,并防止应用程序使用碎片崩溃?_Java_Android_Android Fragments_Memory Leaks - Fatal编程技术网

Java 如何解决内存泄漏问题,并防止应用程序使用碎片崩溃?

Java 如何解决内存泄漏问题,并防止应用程序使用碎片崩溃?,java,android,android-fragments,memory-leaks,Java,Android,Android Fragments,Memory Leaks,我想,当我在android应用程序中使用片段时,我会出现内存泄漏,因为当我添加更多片段时,应用程序会崩溃,而我打开的每个新片段都会出现内存峰值。我如何解决这个问题?我是一个相当新的片段,我已经使用了许多资源来使用适当的。。。至少我是这么想的。当我从一个片段变为另一个片段时,我的堆继续增长,导致内存泄漏 这是我的MainActivity.java import android.os.Bundle; import android.support.v4.app.FragmentActivity; im

我想,当我在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,对内存优化没有帮助

如果有许多片段将占用大量内存,则应使用,这意味着一旦移动到另一个片段,该片段将被销毁。如果您没有那么多的片段,您可以简单地使用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;
          }
     }
}

要从前面的片段中保留内存,您需要进行某种分配,以防止它们被垃圾收集。如果没有他们的代码,就不可能知道他们为什么没有被清除。这个代码中没有内存泄漏。您很可能在某个eventBus中注册片段,或者以某种方式保留对片段的引用,即使在视图寻呼机将其销毁之后也是如此。此外,您还可以在需要显示片段时创建新片段。为什么不检查一下你的FragmentManager中是否有这些文件,如果有,就把它们退回去?你有没有试过FragmentStatePagerAdapter???@JonathanChappell:那么,这方面有什么进展吗?没问题?这会有什么帮助?