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

标签 android lazy-loading picasso async-loading

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

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

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

对于宏伟的 Picasso,令人沮丧的是它看起来像有一个 fork 实际上就是这样做的,它有一个“withDelay”选项**(参见 https://github.com/square/picasso/issues/248)

我害怕 fork 。

但是否可以在 Picasso 中执行此操作,也许使用自定义“目标”?所以,

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

Picasso.
  with(State.mainContext).
  load(imageFile.getUrl()).
  placeholder(R.drawable.default).
  noFade().
  into(v.im);

而我想我想要一些这样的东西......

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

我做不到,谁做得到?

最佳答案

编辑:

很明显,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.
  }
}

此实现的理念是您显然会使用上下文标记您的请求,但您也可以使用默认标记或自定义标记轻松标记。

原答案:

Picasso 上已经有针对此功能的 PullRequest:https://github.com/square/picasso/pull/561

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

它的代码很简单:

listView.setOnScrollListener(new PicassoScrollListener(context));

我同意 fork 很烦人,因为它们可能会过时,但可以自己 fork ,并保持最新,直到它在 Picasso 上合并。

  • fork picasso 原创
  • 将其添加为远程 https://github.com/sockeqwe/picasso并获取它
  • 从 picasso/master 创建你的分支,然后从 sockeqwe/picasso 中挑选 10 个提交
  • 随心所欲地拉 picasso/master

这并不理想,但编程已全部为您完成,并且运行良好。

或者,您可以使用我的应用程序分支 编译 'com.eyeem.picasso:picasso:2.3.3-SNAPSHOT' 并密切关注该拉取请求,直到它被合并并恢复。

关于android - 在 Picasso Android 中实现 "withDelay"(用于略读),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25747696/

相关文章:

hibernate - 在带有 jpa/hibernate 的 Spring 中,如何保持 session 打开以避免延迟初始化异常?

android - 在android中放大和缩小图像

javascript - 如何使用SeleniumWebdriver和Python通过滚动找到网页上的所有元素

java - java编译器会优化基于静态变量条件化的静态函数吗?

java - 为什么Android获取类的声明字段是无序的?

Android数据绑定(bind),无法生成 View 绑定(bind)

java - 如何在 hbm.xml 中的 <key-many-to-one > 映射中设置 fetch ="Join"和 lazy ="False"

java - Android: picasso 在点击时放大图像?

android - picasso 第一次加载不缓存,但第二次就可以了

android - 如何接收带有 Intent 的图像文件?