2016-07-27 27 views
5

Tôi đang sử dụng Picasso để tải xuống nhiều hình ảnh khác nhau. Thông thường, tôi chỉ hiển thị chúng trong một ImageView nhưng trong trường hợp này, tôi muốn giữ một tham chiếu mạnh mẽ với chúng để tôi có thể sử dụng chúng ở những nơi khác nhau mà không cần phải tham khảo lại bộ nhớ cache hoặc tải xuống lại chúng. Dưới đây là cách tôi đang cố gắng để làm điều đó (lưu ý rằng có nhiều hơn để lớp này - Tôi vừa mới thu hẹp nó xuống đến các bộ phận có liên quan đến câu hỏi này):Picasso Tải ảnh vào mục tiêu

public class MapLayer { 

    private Context mContext; 
    private String mType; 
    private Drawable mIcon = null; 

    public MapLayer (Context context, String type) { 
     mContext = context; 
     mType = type; 
     downloadIcon(); 
    } 

    public Drawable getIcon() {return mIcon;} 

    private void downloadIcon() { 

     String url = mContext.getString(R.string.maps_icon_url).replace("${type}", mType)); 

     Target target = new Target() { 
      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
       Log.d(TAG, "on bitmap loaded"); 
       mIcon = new BitmapDrawable(mContext.getResources(), bitmap); 
      } 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) { 
       Log.d(TAG, "on bitmap failed"); 
      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) { 
       Log.d(TAG, "on prepare load"); 
       mIcon = placeHolderDrawable; 
      } 
     }; 

     ImageDownloader.getSharedInstance().load(url).into(target); 
    } 
} 

Trong mọi trường hợp, tôi nhận được đầu ra:

on prepare load

nhưng không có gì khác. Biểu tượng của tôi luôn rỗng. Tôi biết điều này từ các lớp khác mà tôi gọi là getIcon().

Tôi thiếu gì ở đây? Cảm ơn vì bất kì sự giúp đỡ.

Trả lời

6

Picasso giữ Target trường hợp có tham chiếu yếu, Vì vậy, Target của bạn dường như là rác được thu thập.
xem: https://github.com/square/picasso/issues/352

Tốt hơn nên giữ Target làm trường hợp thể hiện.

public class MapLayer { 

    ... 

    private Target target; 

    private void downloadIcon() { 

     ... 

     target = new Target() { 
      ... 
     }; 

     ImageDownloader.getSharedInstance().load(url).into(target); 
    } 
} 
+0

Đó là tất cả những gì tôi cần làm. Cảm ơn rất nhiều! – Alex

2

Vì Picasso chỉ liên quan yếu đến đối tượng Target.

Nếu bạn muốn có tham chiếu mạnh, tôi khuyên bạn nên gắn thẻ Target vào View.
Here is a solution for your problem.

+0

Cảm ơn. Tôi đã thấy bài viết đó, nhưng không nhận ra rằng chìa khóa chỉ là để thúc đẩy tham chiếu 'Target' tới một biến thể hiện. Bây giờ tôi biết. Cảm ơn một lần nữa! – Alex

Các vấn đề liên quan