Реализация "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.
}
}