0

У меня есть 5 SlidingTabs. Я хочу разместить ViewPageranimation в одном из них.ViewPager animation outOfMemoryError

Фрагмент Класс:

public class AdFragment extends Fragment { 

int[] mResources = { 
     R.drawable.six, 
     R.drawable.five, 
     R.drawable.four, 
     R.drawable.eight, 
     R.drawable.one, 
     R.drawable.two, 
     R.drawable.three, 
     R.drawable.seven, 
     R.drawable.nine, 
     R.drawable.ten, 
}; 
int currentPage; 
public AdFragment() { 
    // Required empty public constructor 
} 
Timer swipeTimer; 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_ad, container, false); 
    CustomPagerAdapter mCustomPagerAdapter = new CustomPagerAdapter(getActivity(),mResources); 

    final ViewPager mViewPager = (ViewPager) view.findViewById(R.id.pager); 
    mViewPager.setAdapter(mCustomPagerAdapter); 

    final Handler handler = new Handler(); 
    final Runnable Update = new Runnable() { 
     public void run() { 
      if (currentPage == mResources.length) { 
       currentPage = 0; 
      } 
      mViewPager.setCurrentItem(currentPage++, true); 
     } 
    }; 

    swipeTimer = new Timer(); 
    swipeTimer.schedule(new TimerTask() { 

     @Override 
     public void run() { 
      handler.post(Update); 
     } 
    }, 500, 3000); 

    return view; 
} 

}

Класс адаптера:

class CustomPagerAdapter extends PagerAdapter { 

Context mContext; 
LayoutInflater mLayoutInflater; 
int[] mResources; 
private Resources resource; 

public CustomPagerAdapter(Context context,int[] mResources) { 
    mContext = context; 
    mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.mResources = mResources; 
} 

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

@Override 
public boolean isViewFromObject(View view, Object object) { 
    return view == ((LinearLayout) object); 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    View itemView = mLayoutInflater.inflate(R.layout.pager_item, container, false); 

    ImageView imageView = (ImageView) itemView.findViewById(R.id.imageView); 
    imageView.setImageResource(mResources[position]); 

    container.addView(itemView); 

    return itemView; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    container.removeView((LinearLayout) object); 
} 
@Override 
public Object instantiateItem(View view, int position) { 
    ImageView myView = new ImageView(mContext); 

    Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), mResources[position]); 
    myView.setImageBitmap(bitmap); 

    ((ViewPager) view).addView(myView); 
    return myView; 
} 
} 

На данный момент у меня 10 изображений в slideshow.When я открываю мой Tab с Fragment, описанной выше, подождите на какой-то период, затем попробуйте пойти еще Tab и обратно к этому - я получаю:

01-27 14:13:53.794 12652-12652/igor.com.totalsoulbeta E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: igor.com.totalsoulbeta, PID: 12652 
                    java.lang.OutOfMemoryError 
                     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
                     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587) 
                     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422) 
                     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840) 
                     at android.content.res.Resources.loadDrawable(Resources.java:2113) 
                     at android.content.res.Resources.getDrawable(Resources.java:700) 
                     at android.content.res.XResources.getDrawable(XResources.java:521) 
                     at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:323) 
                     at android.support.v7.widget.TintManager.getDrawable(TintManager.java:175) 
                     at android.support.v7.widget.TintManager.getDrawable(TintManager.java:168) 
                     at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:51) 
                     at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:72) 
                     at igor.com.totalsoulbeta.CustomPagerAdapter.instantiateItem(CustomPagerAdapter.java:46) 

Размер каждого изображения не более 150 кб. Мой вопрос: возможно ли перенести такую ​​анимацию с 25 образами без OutOfMemoryError? Если да, то что мне нужно изменить в моем коде? Как я могу очистить heap и где мне нужно это сделать? Если это не лучший способ анимации, пожалуйста, сообщите мне ваш вариант

Заранее благодарим!

ответ

0

A ViewPager должен иметь возможность показывать любое количество страниц. В любое время он имеет только 3 страницы в памяти (если вы не измените лимит за пределами экрана). Проблема может заключаться в том, что Timer течет. documentation говорит:

Когда таймер больше не требуется, пользователи не должны вызвать отмены(), который релизов нити таймера и другие ресурсы. Таймеры, не указанные явно , могут удерживать ресурсы неограниченно долго.

Помогает ли вам добавить что-то подобное в Fragment? :

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 

    swipeTimer.cancel(); 
    swipeTimer = null; 
} 
+0

Кажется, что это нормально! Благодаря! –