2016-11-08 2 views
2

Я пытаюсь загрузить изображение в мое представление. Иногда это работает, иногда это не так. Я тестирую эмулятор API уровня 19. Блок отката внутри новой цели никогда не вызывается. Я вижу prepareLoad и затем:Загрузка изображения с Picasso не всегда отображается

  1. onBitmapLoaded называется, изображение будет показывать
  2. Изображение не будет показывать

Почему это происходить?

Это происходит на эмуляторе. На физическом устройстве Q & A сообщает о 100% частоте отказа. На других устройствах я вижу прерывистую частоту отказа. Что тут происходит?

public void setBackground() { 
    final LinearLayout mainLayout = (LinearLayout) findViewById(R.id.main_layout); 

    final Context context = this; 
    final String imagePath = getStore().backgroundImageURI;  

    if (getStore().backgroundImageNumber > 0) { 
     mainLayout.setBackground(context.getResources().getDrawable(getStore().backgroundImageNumber)); 
     return; 
    } 
    if (imagePath == null) { 
     mainLayout.setBackground(context.getResources().getDrawable(R.drawable.sk_collection_bg_default)); 
     return; 
    } 
    Picasso.with(this).load(imagePath).into(new Target(){ 
     @Override 
     public void onBitmapLoaded(Bitmap bitmap, LoadedFrom from) { 
      Log.v("Biscuit-width", String.valueOf(bitmap.getWidth())); 
      Log.v("Biscuit-height", String.valueOf(bitmap.getHeight())); 

      mainLayout.setBackground(new BitmapDrawable(context.getResources(), bitmap)); 
     } 

     @Override 
     public void onBitmapFailed(final Drawable errorDrawable) 
     { 
      Log.d("BISCUIT", "FAILED" + errorDrawable.toString()); 

     } 

     @Override 
     public void onPrepareLoad(final Drawable placeHolderDrawable) { 
      Log.d("TAG", "Prepare Load"); 
     } 
    }); 
} 

ответ

0

Я также сталкиваются с этой проблемой, вы должны использовать Picasso как ...

Picasso.Builder builder = new Picasso.Builder(this); 
     builder.listener(new Picasso.Listener() 
     { 
      @Override 
      public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) 
      { 
       exception.printStackTrace(); 
      } 
     }); 
     builder.build().load(imgURL) 
     .placeholder(R.drawable.ic_launcher) 
     .into(imageIMG); 
+0

Я не вижу каких-либо исключений. – quantumpotato

1

Я не использовал Пикассо в то время, но обратно в тот же день, цели были WeakReferences, и вы должны были держать на нем твердую ссылку (простите меня, если это уже не так, но Джейк Уортон был очень категоричен в отношении того, что «ТЫ ХОТИТЕ ДЕРЖАТЬ СВОБОДНУЮ РЕФЕРЕНЦИЮ ИЛИ ЦЕЛЬ, КОТОРУЮ СОБИРАЕТСЯ СБОРКА», вероятно, потому что его попросили то же самое более 9000 раз (включая меня).

Так что взгляните на этот стек ответ перелива на то, что, как представляется, та же проблема ...

https://stackoverflow.com/a/26918731/2684

Как отметили другие респонденты (@lukas и @mradzinski), Пикассо только хранит слабую ссылку на целевой объект. Хотя вы можете хранить сильную ссылку Target в одном из ваших классов, это может быть проблематично, если Target ссылается на View каким-либо образом, так как вы также будете также хорошо ссылаться на этот вид (который является одним из вещи, которые Пикассо явно помогает вам избежать).

Если вы находитесь в этой ситуации, я бы рекомендовал пометить Target для вида.

+0

Так что все, что мне нужно сделать, это сохранить цель в моей деятельности как переменную-член и ссылаться на нее? – quantumpotato

+0

Да, например. :) –

+1

Спасите мой день. Примите этот ответ, это действительно полезно –