我正在使用picassso android库在一个大的图像列表中加载图像。
当我向下滚动时,应用程序会以相对固定的间隔冻结。
在日志中,我看到很多这样的行:

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

我查看了其他照片库应用程序,它们在日志中有类似的gc-for-alloc行,但是它们滚动smooth。
如何防止垃圾回收冻结我的ui线程?
有趣的是,这不是发生在nexus 7(棒棒糖),只是发生在三星galaxy tab s 8,os 4.4.2上。

最佳答案

最新版本的毕加索支持暂停/恢复加载功能,当你有一个大的图像列表时,这个功能特别方便。
它基于标记工作,因此可以调用Picasso.with(context).pauseTag(tag)和picasso.with(context.resume 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(),以便毕加索根据所需大小缩放图像。

08-17 03:42