Реализация "withDelay" в Picasso Android (для скимминга)

При работе со многими изображениями с прокруткой необходимо избегать проблем с загрузкой во время просмотра, когда пользователь выполняет быструю прокрутку. Самое простое и часто лучшее решение удивительно просто:

Просто введите небольшую задержку (скажем, 350), прежде чем что-либо делать.

Если изображение уже в кеше, просто загрузите его. В противном случае, просто подождите немного - и тогда все будет нормально.

С великолепным Пикассо, к сожалению, похоже, что есть форк, который фактически делает именно это, у него есть опция "withDelay" ** (см. https://github.com/square/picasso/issues/248)

Я боюсь вилок.

Но возможно ли это сделать в Пикассо, возможно, используя пользовательскую "цель"? Так,

Мой обычный вызов Пикассо (в конце 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...
     });

Я не могу это сделать, кто-нибудь может это сделать?

2 ответа

Решение

редактировать:

так что, очевидно, парни на площади только начинают продвигаться вперед со своими вещами. 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.
  }
}

эта реализация идет с идеей, что вы, вероятно, пометите свои запросы контекстом, но так же легко вы могли бы пометить тегами по умолчанию или вашими собственными тегами.

оригинальный ответ:

Уже есть PullRequest для Picasso для этой функции здесь: https://github.com/square/picasso/pull/561

Это немного отличается от того, что вы предложили, но прекрасно работает (я использую в своем приложении). У вас есть возможность приостановить / возобновить отправку изображений в ImageViews и использовать onScrollListener приостановить возобновить это.

Код для этого просто:

listView.setOnScrollListener(new PicassoScrollListener(context));

Я согласен с тем, что вилки раздражают, потому что они могут устареть, но могут сами его разветвлять и поддерживать в актуальном состоянии до слияния с Пикассо.

  • вилка пикассо оригинал
  • добавьте это как удаленный https://github.com/sockeqwe/picasso и загрузите его
  • создайте свою ветку из picasso / master и вишни выберите те 10 коммитов из sockeqwe / picasso
  • тянуть Пикассо / мастер так часто, как вы хотите

Это не идеально, но программирование все сделано для вас, и это работает очень хорошо.

В качестве альтернативы вы можете использовать мой app fork compile 'com.eyeem.picasso:picasso:2.3.3-SNAPSHOT' и следите за этим запросом на извлечение, пока он не объединится и вы не вернетесь.

Возможность приостановить / возобновить запрос станет частью следующего выпуска Picasso 2.4. Буквально вчера в основной ветке был объединен пул-запрос, содержащий эту функцию. Это позволяет легко определить слушателя прокрутки, который приостанавливает / возобновляет Пикассо во время броска, как показано в приведенном ниже примере кода:

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.
  }
}
Другие вопросы по тегам