【问题标题】:AndroidImageSlider library memory leakAndroidImageSlider 库内存泄漏
【发布时间】:2025-12-31 15:15:13
【问题描述】:

有没有人解决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

当然我也在onStop()方法中调用removeAllSliders()stopAutoCycle()
但不幸的是它没有帮助

感谢任何建议

【问题讨论】:

    标签: android memory-leaks


    【解决方案1】:

    如果有人遇到同样的问题, 我终于找到了解决方案:

    关键是对 Sliders 使用 Wea​​kReferences。

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

    // 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 对象。

    现在内存泄漏几乎解决了

    【讨论】:

    • 你的代码中关于清除内存的部分在哪里?
    • @XueQing 已经有一段时间了......这可能不是最好的解决方案。但在这个示例中,它是通过 WeakHashMap 解决的,并使用一个(静态)计时器而不是一遍又一遍地生成新计时器。
    • P.S.现在,我当然不会使用这个库
    • 我也有同样的问题。你能告诉我一个更好的滑动图片库吗?
    • 今天我相信你并不真的需要一个库来实现这么简单的目的。只需使用 ViewPager + TabLayout 作为指标并使用 RxJava 的 Observable.interval() 执行自动滚动