简体   繁体   English

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

[英]How can I resolve memory leaks and prevent my app from crashing using fragments?

I think I am getting memory leaks when I use fragments for my android app because when I add more fragments the app crashes and each new fragment I open the memory peaks. 我认为我在Android应用程序中使用片段时会发生内存泄漏,因为当我添加更多片段时,应用程序会崩溃,每个新片段都会打开内存峰值。 How can I resolve this? 我该如何解决? I am fairly new to fragments and I have used many resources to use the appropriately... or so I thought. 我对片段还很陌生,并且我已经使用了很多资源来适当地使用...。 I am getting memory leaks as my heap continues to grow as I change from fragment to fragment. 随着片段的不断变化,堆不断增长,导致内存泄漏。

This is my MainActivity.java 这是我的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);
}
}

This is my PagerAdapter.java 这是我的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;
}


}

Given the code above, when I switch to Fragment 4 or 5 I retain the previous memory that was allocated for the previous fragments and so the app memory levels peak uncontrollably and the app begins to lag. 给定上面的代码,当我切换到片段4或5时,我保留为先前的片段分配的先前的内存,因此应用程序的内存级别不受控制地达到峰值,并且应用程序开始滞后。 Fragment 5 doesn't even load so I don't know whether that is because of there not being enough memory or due to the code being wrong. 片段5甚至没有加载,所以我不知道那是因为没有足够的内存还是由于代码错误。 Please help as I'm lost. 请帮助,因为我迷路了。

do this in adapter.. 在适配器中执行此操作。

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

Just declaring a local fragment variable as null as in solution provided by Sjd will not help in memory optimization. 像Sjd提供的解决方案一样,仅将局部片段变量声明为null不会帮助内存优化。

If you have many fragments that will use up lot of memory, you should use FragmentStatePagerAdapter , which means a fragment will be destroyed once you move to another fragment. 如果您有很多碎片将占用大量内存,则应使用FragmentStatePagerAdapter ,这意味着一旦移至另一个碎片 ,一个碎片将被销毁。 If you don't have that many fragments, you could simply use FragmentPagerAdapter, which keeps your fragments in memory. 如果没有那么多片段,则可以简单地使用FragmentPagerAdapter来将片段保留在内存中。

So your PagerAdapter.java implementation will have to be modified as below: 因此,您的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.

相关问题 如何防止我的应用在没有输入或输入无效时崩溃 - How to prevent my app from crashing when there is no input or if input is invalid 碎片 memory 泄漏 - Fragments memory leaks 当用户输入小数点时,如何错误处理代码以防止程序崩溃? - How can I error handle my code to prevent my program from crashing when the user inputs a decimal point? 如何解决 Intent 崩溃? - How can I resolve Intent crashing? 尝试使用ASyncTask发出GET请求时,如何防止我的应用程序崩溃? - How can I stop my app from crashing when trying to make a GET request with an ASyncTask? 如何解决swing监听器内存泄漏? - How to resolve swing listener memory leaks? 如何使用Android Studio中的AsyncTask阻止我的应用崩溃? - How to stop my app from crashing using AsyncTask in Android Studio? 如何防止任何人与我的服务器通信,除了我的Android应用程序 - How can I prevent anyone from communicating with my server except my Android app 我如何找到导致内存泄漏的应用程序 - how can i find which application is causing memory leaks Android表单验证-如何防止在按下按钮时空字段使我的应用程序崩溃? - Android Form Validation - How do I prevent a null field from crashing my application on button press?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM