为什么垃圾收集会冻结app?

时间:2015-02-01 07:24:15

标签: android garbage-collection picasso

我正在使用Picassso安卓库在一个大的图像列表中加载图像。 当我相对定期地向下滚动app冻结时。

在日志中,我看到很多这样的行:

D/dalvikvm﹕ GC_FOR_ALLOC freed 172K, 5% free 164195K/171316K, paused 365ms, total 366ms

我查看了其他照片库应用,他们在日志中有类似的GC_FOR_ALLOC行,但是它们滚动了。

如何防止垃圾收集冻结我的UI线程?

有趣的一点是,Nexus 7(Lollipop)上没有发生这种情况,只是发生在三星Galaxy Tab S 8,OS 4.4.2上

2 个答案:

答案 0 :(得分:1)

Picasso 的最新版本支持暂停/恢复加载功能,当您拥有大量图片时,这将非常方便。

它基于标签,因此您可以调用Picasso.with(context).pauseTag(tag)和Picasso.with(context).resumeTag()`分别停止加载(当用户滚动时)并恢复加载(滚动时停止或用户触摸滚动时。)

这样的事情肯定会改善滚动体验:

private String scrollTag = "scrollTag";

...

listView.setOnScrollListener(new OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (scrollState == OnScrollListener.SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
            Picasso.with(getActivity()).resumeTag(scrollTag);
        } else {
            Picasso.with(getActivity()).pauseTag(scrollTag);
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}
};

此外,请务必致电fit()resize(w, h) + centerCrop()centerInside(),以便毕加索根据需要缩放图片大小

答案 1 :(得分:0)

您好尝试使用通用图像加载器,默认情况下它会缓存图像并且可高度自定义,请参阅下面的链接:

https://github.com/nostra13/Android-Universal-Image-Loader