我正在使用 Picasso android 库加载大量图像列表中的图像。 当我向下滚动时,应用程序会以相对规律的间隔卡住。
在日志中我看到很多这样的行:
D/dalvikvm﹕ GC_FOR_ALLOC freed 172K, 5% free 164195K/171316K, paused 365ms, total 366ms
我检查了其他相册应用,它们在日志中有类似的 GC_FOR_ALLOC 行,但它们滚动流畅。
如何防止垃圾收集卡住我的 UI 线程?
有趣的是,这不会发生在 Nexus 7(Lollipop)上,只会发生在 Samsung Galaxy Tab S 8,OS 4.4.2
最佳答案
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()
,让Picasso根据需要的尺寸缩放图片。
关于android - 为什么垃圾收集会卡住应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28260489/