2016-07-27 22 views
5

Używam Picassa do pobierania różnych obrazów. Zazwyczaj po prostu wyświetlam je w postaci ImageView, ale w tej sytuacji chcę mieć silne odniesienie do nich, aby móc je używać w różnych miejscach bez konieczności odwoływania się do pamięci podręcznej lub ponownego pobierania. Oto jak ja próbuje zrobić (należy pamiętać, że jest więcej do tej klasy - Właśnie zmniejszyła go do tych części, które są odpowiednie do tego pytania):Picasso Załaduj obraz do celu

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); 
    } 
} 

w każdym przypadku, mam wyjście:

on prepare load

ale nic poza tym. Moja ikona jest zawsze pusta. Wiem o tym z innych klas, gdzie dzwonię pod numer getIcon().

Czego mi tu brakuje? Dzięki za pomoc.

Odpowiedz

6

Picasso posiada instancję Target z słabym odwołaniem, więc Twój Target wydaje się być zbierane śmieci.
patrz: https://github.com/square/picasso/issues/352

Lepiej trzymać Target jako pole instancji.

public class MapLayer { 

    ... 

    private Target target; 

    private void downloadIcon() { 

     ... 

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

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

To wszystko, co musiałem zrobić. Wielkie dzięki! – Alex

2

Jego ponieważ Picasso utrzymuje jedynie słabe odniesienie do obiektu Target.

Jeśli chcesz mieć silne referencje, polecam oznaczenie Target na View.
Here is a solution for your problem.

+0

Dzięki. Widziałem ten post, ale nie zdawałem sobie sprawy, że kluczem jest po prostu propagowanie odniesienia "Target" do zmiennej instancji. Teraz wiem. Dzięki jeszcze raz! – Alex

Powiązane problemy