Ошибки Picasso при обратном вызове

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

Picasso.with(DashboardActivity.this).load(status).into(iv_customer_status_pic, new Callback() {
              @Override public void onSuccess() {
                  Log.d("Debug", "Picasso Success");
              }

              @Override public void onError() {
                  Log.d("Debug", "Picasso Errored");
              }
            });

Как я могу убедиться, что изображения загружены, я не хочу, чтобы они ошибались, а затем заставляли их исчезнуть. И еще, почему ошибка? Есть ли тайм-аут? Я заметил, что на более мощных устройствах это происходит реже.


person AIntel    schedule 25.09.2014    source источник


Ответы (2)


Причины сбоя могут быть связаны с отсутствием подключения к Интернету и неверным URL-адресом изображения. Что касается обработки ошибок, обратитесь к ответу nPn.

person waelhe    schedule 26.09.2014
comment
это скорее комментарий а не ответ - person Anirudh Sharma; 26.09.2014
comment
извините, это потому, что я не могу комментировать чужой пост из-за моей низкой репутации. - person waelhe; 26.09.2014

Причина существования обратного вызова onError() для Picasso.with().load().into(target, callback) заключается в том, что нет 100% гарантии, что загрузка будет успешной. Например, если вы пытаетесь выполнить загрузку с uri и у вас нет подключения к Интернету, загрузка не будет успешной. Вы можете каким-то образом попытаться повторить попытку (которая, я думаю, уже встроена в Picasso), но в конечном итоге вам нужно обработать случай, когда загрузка не удалась (по какой-либо причине). Одним из вариантов может быть загрузка изображения «по умолчанию», например, общего «изображения профиля», если вы пытаетесь загрузить изображение профиля определенного пользователя.

Если вы переместите реализацию обратных вызовов в отдельный класс или даже в содержащий класс, вы сможете повторить попытку обратного вызова onError(). Вот что я думаю:

class ContainingClass implements Callback.EmptyCallback

private int mRetryAttempts = 0;

@Override
public void onError() {
    if (mRetryAttempts < 2) {
        mRetryAttempts++;
        // try again
    } else {
        mRetryAttempts = 0;
    }
}

@Override
public void onSuccess() {
    mRetryAttempts = 0;
}
person nPn    schedule 26.09.2014
comment
В моем случае мне нужно загрузить изображение, поэтому повторная попытка имеет смысл. Есть ли способ увеличить количество пенсионеров? Согласно их сайту, он делает 3 попытки до обратного вызова с ошибкой. - person AIntel; 26.09.2014
comment
Я быстро взглянул и все равно не увидел, но часть моей точки зрения выше заключалась в том, что вы должны иметь возможность использовать обратный вызов onError для повторной попытки. Я добавлю предложенный способ к моему ответу - person nPn; 26.09.2014