2016-11-08 101 views
2

我試圖將圖像加載到我的視圖中。有時它起作用,有時它不起作用。我正在API級別19模擬器上測試。新的Target內部的故障塊永遠不會被調用。我看到prepareLoad,然後或者:加載畢加索的圖像並不總是顯示

  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.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),畢加索只有保持一個弱引用到目標對象注意。雖然您可以在您的某個類中存儲強大的參考目標,但如果目標以任何方式引用視圖,這仍然會有問題,因爲您還將有效地保持對該視圖的強烈引用(這是畢加索明確幫助你避免的事情)。

如果你在這種情況下,我建議標記目標視圖。

+0

所以我需要做的就是在我的Activity中保留一個Target作爲成員變量,並引用它? – quantumpotato

+0

是的,例如。 :) –

+1

保存我的一天。請接受這個答案,這真的很有用 –