为什么垃圾回收会导致应用程序冻结?

3
我将使用Picassso Android库来加载一大堆图片。当我向下滚动时,应用程序会在相对规则的间隔冻结。
在日志中,我看到很多像这样的行:
D/dalvikvm﹕ GC_FOR_ALLOC freed 172K, 5% free 164195K/171316K, paused 365ms, total 366ms

我查看了其他的照片库应用程序,它们的日志中也有类似的"GC_FOR_ALLOC"语句,但是它们却能够平滑滚动。

我该如何防止垃圾回收导致我的用户界面线程冻结?

有趣的是,在Nexus 7 ( Lollipop)上没有出现这种情况,只在Samsung Galaxy Tab S 8,OS 4.4.2上出现。


您可以在Picasso中启用日志记录,查看引起问题的原因。使用setIndicatorsEnabled(boolean)setLoggingEnabled(boolean) - chip
2个回答

1

最新版本的Picasso支持暂停/恢复加载功能,当您有大量图片需要加载时,这一功能尤其方便。

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

像这样做肯定会改善滚动体验:

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()之一,以便Picasso根据所需大小缩放图像。

尝试使用暂停和恢复功能,但在低于5的操作系统上仍然存在问题。 - AVEbrahimi
请考虑发布您用于加载图像的代码。 - Sebastiano

0

刚试了一下通用图像加载器,问题还是一样。 - AVEbrahimi
关于自定义内存/磁盘缓存,能否看到您的代码? - Kevin Crain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接