每次滚动viewpager时都会消耗内存

时间:2018-05-28 11:15:39

标签: android memory-leaks android-viewpager

我的活动中有ViewPager。数据从firebase数据库中获取并设置为viewpager textview。它是一个简单的数据,包含长度为4的字符串数组。 viewpager工作正常。

问题是当我继续滚动像50个滚动时,滚动每次滚动时都会消耗一些内存。因此,在滚动约50次之后,滚动会变得迟钝并且动画不可见且应用程序运行缓慢。

我已经破坏了ViewPager适配器中的视图对象,如下所示:

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    container.removeView((ConstraintLayout) object);
}

我也尝试过使用

  

mViewPager.setOffscreenPageLimit(int limit);

但问题仍然存在。它不断消耗内存,只有在我销毁活动时才释放内存。有什么方法可以在滚动viewpager时释放内存吗?有人可以提供一些帮助。这将是一个很大的帮助。

更新:来自jyoti JK的代码请求,以下是代码:

适配器

public class TextViewPagerAdapter extends PagerAdapter {

Context mContext;
LayoutInflater mLayoutInflater;
private List<PronounceData> lists;

@BindView(R.id.tv_text_display)
TextView mTextDisplay;

public TextViewPagerAdapter(Context context, List<PronounceData> lists) {
    mContext = context;
    this.lists = lists;
}

@Override
public int getCount() {
    return lists.size();
}

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

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
    mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = mLayoutInflater.inflate(R.layout.pronouncer_text_layout, container, false);
    ButterKnife.bind(this, view);
    PronounceData pronounceData = lists.get(position);
    mTextDisplay.setText(pronounceData.getText());
    container.addView(view);
    return view;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    container.removeView((ConstraintLayout) object);
}

}

活动

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_pronounce);
    ButterKnife.bind(this);

    /*
     * Check Permission.
     */
    if (!checkPermission()) {
        requestPermission();
    }

    getDataFromFirebase();

    //Setting ripple Shape
    mRipple.setRippleShape(new Circle());

    mHandler = new Handler();

    mTextSlideViewPager.addOnPageChangeListener(mOnPageChangeListener);
    mTextSlideViewPager.setOffScreenPageLimit(3);

    }
  private void getDataFromFirebase() {
       DatabaseReference mDatabaseRef = 
    FirebaseDatabase.getInstance().getReference();

    mDatabaseRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            fetchData(dataSnapshot);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            fetchData(dataSnapshot);
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

private void fetchData(DataSnapshot dataSnapshot) {
    PronounceData pronounceData = dataSnapshot.getValue(PronounceData.class);

    lists.add(pronounceData);
    mTextViewPagerAdapter = new TextViewPagerAdapter(this, lists);
    mTextSlideViewPager.setAdapter(mTextViewPagerAdapter);
}

1 个答案:

答案 0 :(得分:0)

我自己想出了这个问题。这实际上是我使用的第三方库的问题。该库未进行优化。这是一个图形库。每当我滚动viewpager时,它就会创建一个自己的实例。这导致应用程序滞后。我运行了android profiler并记录了分配并检查了滚动期间内存分配的位置。所以,我这样想。无论如何,我感谢一些试图帮助我的人。 :)