android - 为什么垃圾收集会卡住应用程序?

标签 android garbage-collection picasso

我正在使用 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/

相关文章:

android - 有没有办法让 react-native 忽略一些不 bundle 它们的文件?

内存管理

android - RecyclerView 和 Picasso 图像在滚动后消失

android - 使用 Picasso 和回收站 View 显示图像列表

android - Picasso 将图像加载到 GifImageView(android-gif-drawable 库)

Android 选项卡 fragment 不调用 OnCreateView 从 tab2 切换到 tab1

android - Actionbarsherlock 后退按钮不返回

java - 如何在android中下载JSON数据

java - 当老一代/年轻一代有很多空间时,我经常看到主要的 gc

c#-4.0 - 如果封闭方法即将返回,我是否需要停止秒表?