在Picasso Android中实现"withDelay"(用于略读)

Fat*_*tie 3 android lazy-loading picasso async-loading

在处理许多滚动图像时,您必须避免在略读时加载的问题,同时用户正在快速滚动.最简单且通常最好的解决方案非常简单:

在做任何事情之前,只是引入一个小延迟(比如说.350).

如果图像已经在缓存中,只需加载它.否则只需稍等一下 - 然后完全正常进行.

凭借壮观的毕加索,令人沮丧的是,看起来有一个叉子实际上就是这样,它有一个"withDelay"选项**(见https://github.com/square/picasso/issues/248)

我害怕叉子.

但是有可能在毕加索这样做,也许使用自定义的"目标"?所以,

我普通的Picasso调用(在getView的末尾......)

Picasso.
  with(State.mainContext).
  load(imageFile.getUrl()).
  placeholder(R.drawable.default).
  noFade().
  into(v.im);
Run Code Online (Sandbox Code Playgroud)

而我想,我想要的东西,这样.......

Picasso.
  with(State.mainContext).
  load(imageFile.getUrl()).
  placeholder(R.drawable.default).
  noFade().
  into(new Target()
     {
     simply wait .350 before proceeding completely normally...
     });
Run Code Online (Sandbox Code Playgroud)

我不能这样做,任何人都可以做到吗?

Bud*_*ius 10

编辑:

显然,Square的人们开始向前推进他们的东西. https://github.com/square/picasso/pull/665

所以Lucasr接管并重新组织了一些代码.现在,暂停/恢复可以在组中完成,所有请求都有一个DEFAULT_GROUP显然ScrollListener想法已被抛弃,因为它太过简单的实现让他们烦恼,但它是相同的代码@ a.bertucci发布.

public class SampleScrollListener implements AbsListView.OnScrollListener {
  private final Context context;
  private static final Object scrollTag = new Object(); // this can be static or not, depending what u want to achieve

  public SampleScrollListener(Context context) {
    this.context = context;
  }

  @Override
  public void onScrollStateChanged(AbsListView view, int scrollState) {
    final Picasso picasso = Picasso.with(context);
    if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
      picasso.resumeTag(scrollTag);
    } else {
      picasso.pauseTag(scrollTag);
    }
  }

  @Override
  public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                       int totalItemCount) {
    // Do nothing.
  }
}
Run Code Online (Sandbox Code Playgroud)

这个实现的想法是,您可以使用上下文标记您的请求,但同样可以使用默认标记或自定义标记进行标记.

原始答案:

这里有关于此功能的Picasso已经有一个PullRequest:https://github.com/square/picasso/pull/561

它与你的建议有点不同,但效果很好(我在我的应用程序上使用).您可以选择暂停/继续将图像分派到ImageViews并使用onScrollListener暂停n恢复它.

它的代码很简单:

listView.setOnScrollListener(new PicassoScrollListener(context));
Run Code Online (Sandbox Code Playgroud)

我同意叉子很烦人,因为它们可能会过时,但可以自己分叉,并保持最新状态,直到它在Picasso上合并为止.

  • 叉毕加索原创
  • 将其添加为远程https://github.com/sockeqwe/picasso并获取它
  • 用picasso/master创建你的分支,并从sockeqwe/picasso中选择那些10个提交
  • 随意拉毕加索/大师

这不是理想的,但编程都是为你完成的,而且效果很好.

或者你可以使用我的app fork compile 'com.eyeem.picasso:picasso:2.3.3-SNAPSHOT'并密切关注该pull请求,直到它被合并并且你还原.


a.b*_*cci 6

暂停/恢复请求的能力将成为Picasso 2.4下一版本的一部分.就在昨天,包含此功能的pull请求已合并到主分支中.它允许轻松定义滚动监听器,在投掷时暂停/恢复Picasso,如下面报告的示例代码所示:

public class SampleScrollListener implements AbsListView.OnScrollListener {
  private final Context context;

  public SampleScrollListener(Context context) {
    this.context = context;
  }

  @Override
  public void onScrollStateChanged(AbsListView view, int scrollState) {
    final Picasso picasso = Picasso.with(context);
    if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
      picasso.resumeTag(context);
    } else {
      picasso.pauseTag(context);
    }
  }

  @Override
  public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                       int totalItemCount) {
    // Do nothing.
  }
}
Run Code Online (Sandbox Code Playgroud)