AndroidImageSlider库内存泄漏

时间:2016-02-18 18:06:46

标签: android memory-leaks

有没有人解决 daimajia AndroidImageSlider 库内存泄漏?

我在我的项目中使用它,它完全满足所有需求 唯一的麻烦是碎片重新生成后发生的内存泄漏 这个"滑动画廊的老实例"留在内存中,它会导致OutOfMemory。

我尝试重写SliderLayout.java中的onDetachedFromWindow方法

@Override
    public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    if(mCycleTimer != null) mCycleTimer.cancel();
    if(mCycleTask != null) mCycleTask.cancel();
    if(mResumingTask != null) mResumingTask.cancel();
    if(mResumingTimer != null) mResumingTimer.cancel();
    mh.removeCallbacksAndMessages(null);
}

如此处所述:https://github.com/daimajia/AndroidImageSlider/issues/122

当然,我也会在removeAllSliders()方法中致电stopAutoCycle()onStop() 但不幸的是,它没有帮助

感谢任何建议

1 个答案:

答案 0 :(得分:-1)

如果有人在同一个问题上挣扎, 我终于找到了解决方案:

关键是使用WeakReferences for Sliders。

所以我的情况看起来如何:

// I use self modified CustomSliderView, but you are free to use base sliders as well
WeakHashMap<Integer, CustomSliderView> mWaeakSliderMap;

然后在onCreateView中以这种方式添加滑块:

mWaeakSliderMap = new WeakHashMap<>();

// adding sliders to the weak map
// sAdvertisementBitmaps is an ArrayList of Files in my case
for (int i = 0; i < sAdvertisementBitmaps.size(); i++) {

        final CustomSliderView sliderView = new CustomSliderView(mContext);
        sliderView.image(sAdvertisementBitmaps.get(i));

        mWaeakSliderMap.put(i, sliderView);
}

        // attaching sliders to the slider layout
        for (Map.Entry<Integer, CustomSliderView> entry : mWaeakSliderMap.entrySet()) {

       mSliderLayout.addSlider(entry.getValue());
}

另外在SliderLayout.java中 我将下一个字段设为静态: 的 mCycleTimer; mCycleTask; mResumingTimer; mResumingTask;

因此它可以防止无用的重新创建TimerTask对象。

现在内存泄漏几乎已经解决了