2013-06-11 2 views
17

Я играю с библиотекой Picasso для загрузки изображений, но у меня возникает проблема. Когда изображение не загружается, я хочу скрыть представление, а не загружать изображение по умолчанию. Я заметил из источника, что похоже, что единственный способ добавить слушателя из конструктора, но метод ошибки никогда не вызывается, когда изображение не загружается. У кого-нибудь есть опыт?Библиотека Пикассо, Android: Использование прослушивателя ошибок

iv = (ImageView) findViewById(R.id.imageView); 

    Picasso.Builder builder = new Picasso.Builder(getApplicationContext()); 
    builder.listener(new Picasso.Listener() { 

     @Override 
     public void onImageLoadFailed(Picasso arg0, String arg1) { 
      Log.e("Picasso Error", "Errored out, hiding view"); 
      iv.setVisibility(View.GONE); 
     } 
    }); 
    Picasso pic = builder.build(); 
    pic.load("thisshouldbreak.jpg").into(iv); 

ответ

43

Picasso 2.0 позволяет подключить обратный вызов в запрос.

https://github.com/square/picasso

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

Использование load(url).into(view, new Callback() {...}); в Picasso 2.0.

Помните, что вы используете cancelRequest(target), если вы используете Callback.

+0

Как я могу получить Picasso 2.0? Я вижу только 1.1.1. – howettl

+0

Получить исходный код и создать банку вручную. Официальный релиз скоро. – dnkoutso

+1

@howettl get [Picasso2] (https://twitter.com/dnkoutso/status/369987447834173440) здесь – Asthme

1

Просто предложение, но вы можете избежать проблем при программировании, если вы создадите «пустой» png-файл и установите его как файл образа по умолчанию в папке res ... вроде глупо, я знаю ... но, вероятно, работаю без борьбы ...

+0

Практически. конечно, в некоторых случаях, если URL-адрес изображения не является допустимым форматом, это хорошее предложение. но что, если какой-то URL-адрес 1. //cdn.bla2.com/sample.png 2. http://cdn.bla2.com/sample.png В этом случае это ошибки из-за только префикса, поэтому полезно проверить эту ошибку, а также –

+0

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

+1

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

13

Мой пример:

Picasso picasso = new Picasso.Builder(parent.getContext()) 
      .listener(new Picasso.Listener() { 
       @Override 
       public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) { 
       //Here your log 
       } 
      }) 
      .build(); 
    picasso.load(shopModel.getShopImg()) 
      .fit() 
      .into(viewHolder.shopImg); 
3

Мой ответ:

File file = new File(filePath); 
     Picasso.with(context).load(file).placeholder(R.drawable.draw_detailed_view_display).error(R.drawable.draw_detailed_view_display) 
     .resize(400, 400).into(mImageView, new Callback() { 

      @Override 
      public void onSuccess() { 

      } 

      @Override 
      public void onError() { 
       mImageView.setVisibility(View.GONE); 
      } 
     }); 
+0

Привет, спасибо за поддержку , Похоже на то, что более подробное объяснение кода будет более полезным –

4

Вы можете попробовать добавить 'глобальный' слушателя.

// create Picasso.Builder object 
    Picasso.Builder picassoBuilder = new Picasso.Builder(this); 

    picassoBuilder.listener(new Picasso.Listener() { 
     @Override 
     public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) { 
      Log.e("PICASSO", uri.toString(), exception); 
     } 
    }); 

    // Picasso.Builder creates the Picasso object to do the actual requests 
    Picasso picasso = picassoBuilder.build(); 

    try { 
     Picasso.setSingletonInstance(picasso); 
    } catch (IllegalStateException ignored) { 
     // Picasso instance was already set 
     // cannot set it after Picasso.with(Context) was already in use 
    } 

Любые последующие вызовы Picasso.with(Context context) возвращает экземпляр, который подключен к слушателю, так что все не удается будет зарегистрирован.

Обратите внимание, что вам необходимо позвонить по телефону setSingletonInstance как можно скорее, например. в приложении onCreate.

P.S. Принятый здесь код - Customizing Picasso with Picasso.Builder

+1

Спасибо! Это также позволило мне использовать пользовательский okhttpclient, используя самоподписанные сертификаты. – Cognoscis

0

Когда мы получили ошибку, ошибка отправляется в onError, тогда мы справляемся с этим!

private void getAvatar(){ 
    try { 
     Picasso.with(mContext) 
       .load(G.GET_AVATAR + '/' + G.SPUser.getString(G.PHONE_NUMBER_KEY, null) + ".jpg") 
       .into(imgUserAvatar, new Callback() { 
        @Override 
        public void onSuccess() { 

        } 

        @Override 
        public void onError() { 
         imgUserAvatar.setImageResource(R.drawable.icon_profile_default); 
        } 
       }); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

Вы немного опоздали на вечеринку: P Это от 4 лет назад до того, как существовал onError. –

Смежные вопросы