4

Je suis confronté à OutOfMemoryErrors dans une application sur laquelle je travaille et j'ai de la difficulté à trouver une solution et quel est le problème. J'utilise le FragmentStatePagerAdapter, car cela semblait être la meilleure/recommandée alternative. J'utilise aussi Universal Image Loader v.1.8.4. Ce qui se passe, c'est que lorsque vous parcourez les vues, le tas croît et finit par manquer de mémoire. Voici une sortie petit échantillon:FragmentStatePagerAdapter OutOfMemoryError

05-06 14:38:23.096: D/dalvikvm(29322): GC_CONCURRENT freed 187K, 5% free 7532K/7868K, paused 7ms+13ms, total 37ms 
05-06 14:38:23.176: D/dalvikvm(29322): GC_FOR_ALLOC freed 96K, 4% free 7656K/7920K, paused 17ms, total 17ms 
05-06 14:38:23.206: D/dalvikvm(29322): GC_FOR_ALLOC freed <1K, 4% free 8234K/8500K, paused 15ms, total 15ms 
05-06 14:38:23.246: D/dalvikvm(29322): GC_CONCURRENT freed 4K, 3% free 8262K/8500K, paused 5ms+5ms, total 31ms 
05-06 14:38:23.276: D/dalvikvm(29322): GC_FOR_ALLOC freed 29K, 3% free 8289K/8500K, paused 20ms, total 25ms 
05-06 14:38:23.286: D/dalvikvm(29322): GC_FOR_ALLOC freed <1K, 3% free 9342K/9556K, paused 15ms, total 15ms 
05-06 14:38:23.316: D/dalvikvm(29322): GC_CONCURRENT freed 27K, 3% free 9327K/9556K, paused 3ms+2ms, total 22ms 
05-06 14:38:24.626: D/dalvikvm(29322): GC_FOR_ALLOC freed 83K, 3% free 9462K/9696K, paused 15ms, total 16ms 
05-06 14:38:24.646: D/dalvikvm(29322): GC_FOR_ALLOC freed 3K, 3% free 10201K/10440K, paused 16ms, total 16ms 
05-06 14:38:24.666: D/dalvikvm(29322): GC_CONCURRENT freed 3K, 3% free 10214K/10440K, paused 3ms+3ms, total 26ms 
05-06 14:38:24.976: D/dalvikvm(29322): GC_FOR_ALLOC freed 68K, 3% free 10291K/10508K, paused 16ms, total 17ms 
05-06 14:38:24.986: D/dalvikvm(29322): GC_FOR_ALLOC freed <1K, 2% free 11297K/11516K, paused 15ms, total 15ms 
05-06 14:38:25.016: D/dalvikvm(29322): GC_CONCURRENT freed 8K, 2% free 11305K/11516K, paused 3ms+4ms, total 24ms 
05-06 14:38:25.346: D/dalvikvm(29322): GC_CONCURRENT freed 74K, 2% free 12458K/12680K, paused 2ms+3ms, total 23ms 
05-06 14:38:25.976: D/dalvikvm(29322): GC_FOR_ALLOC freed 151K, 3% free 13485K/13792K, paused 22ms, total 22ms 
05-06 14:38:26.276: D/dalvikvm(29322): GC_CONCURRENT freed 95K, 2% free 15384K/15636K, paused 3ms+3ms, total 26ms 
05-06 14:38:27.196: D/dalvikvm(29322): GC_FOR_ALLOC freed 222K, 3% free 17111K/17484K, paused 24ms, total 24ms 
05-06 14:38:28.446: D/dalvikvm(29322): GC_FOR_ALLOC freed 247K, 2% free 19784K/20180K, paused 22ms, total 22ms 
05-06 14:38:29.396: D/dalvikvm(29322): GC_FOR_ALLOC freed 248K, 2% free 23137K/23540K, paused 23ms, total 24ms 
05-06 14:38:30.976: D/dalvikvm(29322): GC_FOR_ALLOC freed 391K, 2% free 27770K/28308K, paused 29ms, total 29ms 
05-06 14:38:33.366: D/dalvikvm(29322): GC_CONCURRENT freed 516K, 2% free 33964K/34628K, paused 3ms+6ms, total 45ms 
05-06 14:38:36.126: D/dalvikvm(29322): GC_FOR_ALLOC freed 608K, 2% free 41164K/41920K, paused 37ms, total 37ms 
05-06 14:38:38.396: D/dalvikvm(29322): GC_CONCURRENT freed 598K, 2% free 48739K/49484K, paused 4ms+10ms, total 59ms 
05-06 14:38:41.496: D/dalvikvm(29322): GC_CONCURRENT freed 723K, 2% free 56176K/57044K, paused 2ms+13ms, total 71ms 
05-06 14:38:41.496: D/dalvikvm(29322): WAIT_FOR_CONCURRENT_GC blocked 62ms 
05-06 14:38:45.176: I/dalvikvm-heap(29322): Clamp target GC heap from 69.393MB to 64.000MB 
05-06 14:38:45.176: D/dalvikvm(29322): GC_FOR_ALLOC freed 597K, 2% free 62724K/63476K, paused 56ms, total 56ms 
05-06 14:38:45.936: I/dalvikvm-heap(29322): Clamp target GC heap from 71.379MB to 64.000MB 
05-06 14:38:45.936: D/dalvikvm(29322): GC_FOR_ALLOC freed 216K, 1% free 64758K/65412K, paused 50ms, total 50ms 
05-06 14:38:45.996: I/dalvikvm-heap(29322): Clamp target GC heap from 71.338MB to 64.000MB 
05-06 14:38:45.996: D/dalvikvm(29322): GC_BEFORE_OOM freed 43K, 2% free 64714K/65412K, paused 60ms, total 60ms 
05-06 14:38:46.336: I/dalvikvm-heap(29322): Clamp target GC heap from 71.462MB to 64.000MB 
05-06 14:38:46.336: D/dalvikvm(29322): GC_FOR_ALLOC freed 139K, 2% free 64841K/65500K, paused 52ms, total 52ms 
05-06 14:38:46.396: I/dalvikvm-heap(29322): Clamp target GC heap from 71.462MB to 64.000MB 
05-06 14:38:46.396: D/dalvikvm(29322): GC_BEFORE_OOM freed <1K, 2% free 64840K/65500K, paused 62ms, total 62ms 

Tout d'abord, oui, je l'ai fait beaucoup de creuser sur stackoverflow et d'autres sites à essayer de comprendre quel est le problème. J'ai essayé différentes solutions qui recyclent les bitmaps, utilisent unbindDrawables, et essayent de supprimer des vues/recycler des bitmaps dans destroyItem() de PagerAdapter ... pour n'en citer que quelques unes. Aucun de ceux-ci ont travaillé pour moi (je peux fournir plus de détails sur ce que j'ai fait si nécessaire). Donc, en un mot, je suis capable de reproduire mon problème en utilisant une version modifiée de this example (Du site Google Developers). Je l'ai modifié un peu pour travailler avec Universal Image Loader v.1.8.4 et j'ai également rendu la mise en page un peu plus complexe pour imiter quelque peu ce que j'ai dans l'application sur laquelle je travaille. La raison pour laquelle j'ai changé la disposition était parce que tout semble fonctionner correctement si vous faites la mise en page vraiment simple et n'incluez qu'une image et quelques champs de texte. Lorsque la mise en page devient plus complexe et lorsque vous commencez à ajouter plus de pages à l'adaptateur, vous commencez à rencontrer des erreurs de MOO. Cependant, je ne suis pas sûr que ce soit un problème avec la mise en page ou UIL ... lire la suite ...

J'ai lancé MAT dans Eclipse et voici ce qu'il dit sous le seul rapport de fuites suspectes (seulement 1 problème):

One instance of "com.example.android.animationsdemo.ScreenSlideActivity$ScreenSlidePagerAdapter" 
loaded by "dalvik.system.PathClassLoader @ 0x42124098" occupies 56,171,048 (86.62%) bytes. 
The memory is accumulated in one instance of "java.lang.Object[]" loaded by "<system class loader>". 

Keywords 
java.lang.Object[] 
dalvik.system.PathClassLoader @ 0x42124098 
com.example.android.animationsdemo.ScreenSlideActivity$ScreenSlidePagerAdapter 

Si vous puis vérifier l'arbre Dominator et développez le ScreenSlidePagerAdapter, il montre 25 de 59 entrées pour les éléments suivants:

> java.util.ArrayList @ 0x4216ccf0 
    > java.lang.Object[60] @ 0x44b07d8 
     > android.app.Fragment$SavedState @ 0x439bd038 

Je ne suis pas expert avec cet outil et je m assez nouveau pour Android et le développement en général, mais il semble que l'état enregistré pour l'adaptateur n'est pas se purge correctement et c'est ce qui provoque le problème de MOO (il sauvegarde l'ensemble de la vue, pas seulement les bitmaps). Cependant, je n'ai pas été capable de comprendre comment effacer/libérer/détruire/quelles que soient les données d'état enregistrées ou si je fais quelque chose de mal ailleurs. J'ai couru dans un post qui a dit d'essayer d'utiliser .setSaveEnabled(false), mais cela n'a pas fait de différence, j'ai toujours eu les erreurs OOM. J'ai même essayé de surcharger saveState() pour l'adaptateur et de retourner null et cela n'a pas fait de différence non plus.

est ici d'info code/config pertinente qui devrait, espérons répondre à la plupart des questions:

Pour UIL, je suis juste en utilisant la configuration par défaut, étant donné que les changements ne semblent pas faire une différence:

imageLoader.init(ImageLoaderConfiguration.createDefault(this)); 

ScreenSlideActivity:

public class ScreenSlideActivity extends FragmentActivity { 
    /** 
    * The number of pages (wizard steps) to show in this demo. 
    */ 
    private static final String[] IMAGES = Constants.IMAGES; 

    /** 
    * The pager widget, which handles animation and allows swiping horizontally to access previous 
    * and next wizard steps. 
    */ 
    private ViewPager mPager; 

    /** 
    * The pager adapter, which provides the pages to the view pager widget. 
    */ 
    private PagerAdapter mPagerAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_screen_slide); 

     // Instantiate a ViewPager and a PagerAdapter. 
     mPager = (ViewPager) findViewById(R.id.pager); 
     mPagerAdapter = new ScreenSlidePagerAdapter(getFragmentManager(), IMAGES); 

     mPager.setSaveEnabled(false); // <--- THIS DOESN'T APPEAR TO MAKE ANY DIFFERENCE 

     mPager.setAdapter(mPagerAdapter); 
     mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       // When changing pages, reset the action bar actions since they are dependent 
       // on which page is currently active. An alternative approach is to have each 
       // fragment expose actions itself (rather than the activity exposing actions), 
       // but for simplicity, the activity provides the actions in this sample. 
       invalidateOptionsMenu(); 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     getMenuInflater().inflate(R.menu.activity_screen_slide, menu); 

     menu.findItem(R.id.action_previous).setEnabled(mPager.getCurrentItem() > 0); 

     // Add either a "next" or "finish" button to the action bar, depending on which page 
     // is currently selected. 
     MenuItem item = menu.add(Menu.NONE, R.id.action_next, Menu.NONE, 
       (mPager.getCurrentItem() == mPagerAdapter.getCount() - 1) 
         ? R.string.action_finish 
         : R.string.action_next); 
     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       // Navigate "up" the demo structure to the launchpad activity. 
       // See http://developer.android.com/design/patterns/navigation.html for more. 
       NavUtils.navigateUpTo(this, new Intent(this, MainActivity.class)); 
       return true; 

      case R.id.action_previous: 
       // Go to the previous step in the wizard. If there is no previous step, 
       // setCurrentItem will do nothing. 
       mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
       return true; 

      case R.id.action_next: 
       // Advance to the next step in the wizard. If there is no next step, setCurrentItem 
       // will do nothing. 
       mPager.setCurrentItem(mPager.getCurrentItem() + 1); 
       return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * A simple pager adapter that represents 5 {@link ScreenSlidePageFragment} objects, in 
    * sequence. 
    */ 
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
     String[] mImages; 
     public ScreenSlidePagerAdapter(FragmentManager fm, String[] images) { 
      super(fm); 
      this.mImages = images; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return ScreenSlidePageFragment.create(position, mImages); 
     } 

     @Override 
     public int getCount() { 
      return IMAGES.length; 
     } 
    } 
} 

ScreenSlidePageFragment, appelé par l'activité ci-dessus:

public class ScreenSlidePageFragment extends Fragment { 

    // Universal Image Loader 
    private DisplayImageOptions mOptions; 
    protected ImageLoader mImageLoader = ImageLoader.getInstance(); 

    /** 
    * The argument key for the page number this fragment represents. 
    */ 
    public static final String ARG_PAGE = "page"; 

    public static final String ARG_IMAGES = "images"; 

    /** 
    * The fragment's page number, which is set to the argument value for {@link #ARG_PAGE}. 
    */ 
    private int mPageNumber; 
    private String[] mImages; 

    /** 
    * Factory method for this fragment class. Constructs a new fragment for the given page number. 
    */ 
    public static ScreenSlidePageFragment create(int pageNumber, String[] images) { 
     ScreenSlidePageFragment fragment = new ScreenSlidePageFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PAGE, pageNumber); 
     args.putStringArray(ARG_IMAGES, images); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public ScreenSlidePageFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mPageNumber = getArguments().getInt(ARG_PAGE); 
     mImages = getArguments().getStringArray(ARG_IMAGES); 

     mOptions = new DisplayImageOptions.Builder() 
     .showImageForEmptyUri(R.drawable.ic_empty) 
     .showImageOnFail(R.drawable.ic_error) 
     .resetViewBeforeLoading() 
     .cacheOnDisc() 
     .imageScaleType(ImageScaleType.EXACTLY) 
     .bitmapConfig(Bitmap.Config.RGB_565) 
     .displayer(new SimpleBitmapDisplayer()) 
     .build(); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // Inflate the layout containing a title and body text. 
     ViewGroup rootView = (ViewGroup) inflater 
       .inflate(R.layout.fragment_screen_slide_page, container, false); 

     // Set the title view to show the page number. 
     ((TextView) rootView.findViewById(android.R.id.text1)).setText(
       getString(R.string.title_template_step, mPageNumber + 1)); 
     displayImageFile(rootView); 
     return rootView; 
    } 

    private void displayImageFile (ViewGroup view) { 

     ImageView imageView = (ImageView) view.findViewById(R.id.item_image_to_display); 

     mImageLoader.displayImage(mImages[mPageNumber], imageView, mOptions); 

    } 

    /** 
    * Returns the page number represented by this fragment object. 
    */ 
    public int getPageNumber() { 
     return mPageNumber; 
    } 
} 

Mise en page activity_screen_slide.xml utilisé par ScreenSlideActivity et id pour ViewPager:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

fragment_screen_slide_page.xml utilisé par ScreenSlidePageFragment:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <!-- Dummy content. --> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:padding="16dp" > 

     <TextView 
      android:id="@android:id/text1" 
      style="?android:textAppearanceLarge" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="16dp" 
      android:textStyle="bold" /> 

     <TextView 
      style="?android:textAppearanceMedium" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:lineSpacingMultiplier="1.2" 
      android:text="@string/lorem_ipsum" /> 

     <TextView 
      android:id="@+id/item_details" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:gravity="center_vertical" 
      android:text="@string/item_details" /> 

     <TextView 
      android:id="@+id/item_type_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="@string/item_type_text" /> 

     <Spinner 
      android:id="@+id/item_type" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:prompt="@string/item_type_text" 
      android:text="@string/item_type" /> 

     <TextView 
      android:id="@+id/item_name_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="@string/item_name_text" /> 

     <EditText 
      android:id="@+id/item_name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:gravity="top|left" 
      android:hint="@string/item_name" 
      android:inputType="text" /> 

     <TextView 
      android:id="@+id/item_text_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="@string/item_text_text" /> 

     <EditText 
      android:id="@+id/item_text" 
      android:layout_width="wrap_content" 
      android:layout_height="100dp" 
      android:layout_marginLeft="10dp" 
      android:ems="10" 
      android:gravity="top|left" 
      android:hint="@string/item_text" 
      android:inputType="textMultiLine" /> 

     <TextView 
      android:id="@+id/sound_edit_text" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:gravity="center_vertical" 
      android:text="@string/sound_edit" /> 

     <ImageView 
      android:id="@+id/item_add_audio" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="10dp" 
      android:contentDescription="@string/cd_image_add_button" 
      android:src="@android:drawable/ic_menu_add" /> 

     <TextView 
      android:id="@+id/recording_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:layout_marginBottom="20dp" 
      android:layout_marginTop="20dp" 
      android:text="@string/recording_text" /> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal" 
      android:padding="16dp" > 

      <ImageButton 
       android:id="@+id/item_play_audio" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_weight="33" 
       android:contentDescription="@string/cd_play_sound_button" 
       android:soundEffectsEnabled="false" 
       android:src="@drawable/play" /> 

      <ImageButton 
       android:id="@+id/item_stop_audio" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_weight="34" 
       android:contentDescription="@string/cd_stop_sound_button" 
       android:soundEffectsEnabled="false" 
       android:src="@drawable/stop" /> 

      <ImageButton 
       android:id="@+id/item_record_audio" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_weight="33" 
       android:contentDescription="@string/cd_record_sound_button" 
       android:soundEffectsEnabled="false" 
       android:src="@drawable/rec" /> 
     </LinearLayout> 

     <TextView 
      android:id="@+id/edit_image" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:gravity="center_vertical" 
      android:text="@string/edit_image" /> 

     <TextView 
      android:id="@+id/image_replace_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:layout_marginBottom="10dp" 
      android:layout_marginTop="10dp" 
      android:text="@string/image_replace" 
      android:visibility="visible" /> 

     <ImageView 
      android:id="@+id/item_image_to_display" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:adjustViewBounds="true" 
      android:contentDescription="@string/cd_item_image" /> 

     <TextView 
      android:id="@+id/item_image_effect_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="@string/item_image_effect_text" /> 

     <Spinner 
      android:id="@+id/item_image_effect" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" /> 

     <TextView 
      android:id="@+id/item_text_color_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="@string/item_text_color_text" /> 

     <Spinner 
      android:id="@+id/item_text_color" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" /> 

     <TextView 
      android:id="@+id/item_text_size_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="@string/item_text_size_text" /> 

     <EditText 
      android:id="@+id/item_text_size" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:hint="@string/item_text_size" 
      android:inputType="number" /> 

     <TextView 
      android:id="@+id/item_text_style_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="@string/item_text_style_text" /> 

     <Spinner 
      android:id="@+id/item_text_style" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" /> 

     <TextView 
      android:id="@+id/item_text_alignment_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="@string/item_text_alignment_text" /> 

     <Spinner 
      android:id="@+id/item_text_alignment" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" /> 

     <TextView 
      android:id="@+id/item_background_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="@string/item_background_text" /> 

     <Spinner 
      android:id="@+id/item_background" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" /> 
    </LinearLayout> 

</ScrollView> 

De plus, voici l'erreur OOM que je rencontre:

05-06 16:37:59.656: E/ImageLoader(3175): null 
05-06 16:37:59.656: E/ImageLoader(3175): java.lang.OutOfMemoryError 
05-06 16:37:59.656: E/ImageLoader(3175): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
05-06 16:37:59.656: E/ImageLoader(3175): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:529) 
05-06 16:37:59.656: E/ImageLoader(3175): at com.nostra13.universalimageloader.core.ImageDecoder.decode(ImageDecoder.java:82) 
05-06 16:37:59.656: E/ImageLoader(3175): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:270) 
05-06 16:37:59.656: E/ImageLoader(3175): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:224) 
05-06 16:37:59.656: E/ImageLoader(3175): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:149) 
05-06 16:37:59.656: E/ImageLoader(3175): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
05-06 16:37:59.656: E/ImageLoader(3175): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
05-06 16:37:59.656: E/ImageLoader(3175): at java.lang.Thread.run(Thread.java:856) 

Que puis-je regarder/changement afin de se débarrasser des erreurs de OOM?

Répondre

4

Il s'avère que c'était unbindDrawables qui a fini par réparer mon problème. Je ne savais pas ce que je faisais mal avant (trop tard ... ??? ;-)), mais j'ai couru à travers this post et cela a résolu mon problème. Le post mentionné ci-dessus était un peu différent de certains des autres posts unbindDrawable que j'avais vus et je n'ai pas eu d'erreurs comme j'avais quand j'avais essayé d'autres versions (ce qui aurait pu être quelque chose de stupide de ma part).

I mis en œuvre ce qui suit dans la classe ScreenSildePageFragment et résoudre mes problèmes OOM:

@Override 
protected void onDestroy() 
{ 
     super.onDestroy(); 

     unbindDrawables(mRootView.findViewById(R.id.content)); // <---This should be the ID of this fragments (ScreenSlidePageFragment) layout 
} 

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(); 
     } 
} 

Note: Je ne suis pas allé System.gc(); après avoir appelé unbindDrawables() dans OnDestroy() comme mentionné dans le poste. L'utiliser n'a pas semblé faire de réelle différence sur les appareils testés et j'ai pensé qu'il était probablement préférable de laisser le système gérer le garbage collection.

+0

Enfin, été à la recherche d'une solution similaire pendant un certain temps. Salutations –

+0

Pourquoi la méthode unbindDrawables() donne-t-elle une exception de pointeur nul dans mon cas? –

+0

@SalmanKhan, c'est probablement parce que vous lui passez une vue nulle. Assurez-vous que toutes vos vues/variables sont configurées correctement. Sans exemples de code, personne ne peut vraiment vous aider. Dans ce cas, il est probablement préférable de poster votre code en tant que question pour obtenir de l'aide. – Jason

0

J'ai rencontré un problème similaire. L'instanciation de l'adaptateur avec getChildFragmentManager() au lieu de getFragmentManager() a résolu mon problème.