2014-10-22 6 views
7

Ich benutze Picasso in meiner App.Picasso Singleton Verwendung

Zuerst verwende ich nur das Format unter:

Picasso.with(context)....into(imgView); 

Auf diese Weise Ich gehe davon verwende ich Picasso als Singleton. Tu ich?

Zweitens möchte ich setIndicatorsEnabled verwenden. Es kann dem obigen Format jedoch nicht hinzugefügt werden, da es keine statische Methode ist. Gibt es eine Möglichkeit, diese Funktion im obigen Format zu verwenden?

Drittens, wenn ich eine benutzerdefinierte Instanz mit Picasso.Builder(...).build() erstellen muss, um setIndicatorsEnabled zu verwenden, was ist der beste Weg, Singleton-Nutzung über die Aktivitäten der App zu erreichen?

+3

'Do I?': siehe https://github.com/square/picasso/blob/master/picasso/src/main/java/com/squareup/picasso/Picasso.java# L591 (ja) – njzk2

+2

'setIndicatorsEna bled': 'with' gibt eine Instanz zurück. Rufen Sie 'setIndicatorsEnabled' für diese Instanz auf – njzk2

Antwort

10

Ja Sie davon ausgehen, Picasso eine Singleton-Instanz ist, wenn Sie Picasso.with verwenden (Kontext) ....

verwenden Satz Indikatoren aktiviert

Picasso mPicasso = Picasso.with(context); 
mPicasso.setIndicatorsEnabled(true); 
mPicasso....load().into(imageView); 

, wenn Sie den Builder verwenden, sollten Sie erstellen Ihre Eigenes Singleton, um Ihre Instanz von Picasso zu halten und es zu bereinigen, wenn Sie fertig sind. Verwenden Sie den Builder nicht jedes Mal, wenn Sie Picasso verwenden, da dadurch eine neue Instanz erstellt wird. Ich glaube, dass Picasso.with (context) nur Ihren Kontext nimmt und getApplicationContext aufruft und eine Singleton-Instanz von Picasso mit dem Anwendungskontext speichert.

3

Hier ist ein guter Weg, um eine Singleton Picasso Klasse

public class ImageHandler { 

    private static Picasso instance; 

    public static Picasso getSharedInstance(Context context) 
    { 
     if(instance == null) 
     { 
      instance = new Picasso.Builder(context).executor(Executors.newSingleThreadExecutor()).memoryCache(Cache.NONE).indicatorsEnabled(true).build(); 
     } 
     return instance; 
    } 
} 

Und dann eine Implementierung davon in Code zu implementieren würde wie folgt aussehen:

ImageHandler.getSharedInstance(getApplicationContext()).load(imString).skipMemoryCache().resize(width, height).into(image, new Callback() { 
     @Override 
     public void onSuccess() { 
      layout.setVisibility(View.VISIBLE); 
     } 

     @Override 
     public void onError() { 

     } 
    }); 

Beachten Sie, dass Sie nicht zu Implementieren Sie die Rückrufe, falls nicht erforderlich

+1

Wenn Sie diese Return-Anweisung außerhalb Ihrer if-else-Klausel platzieren und das Duplikat entfernen, wird Ihr Code viel sauberer sein. –

+2

Einverstanden, danke .... nicht immer die beste Methode beim ersten Mal. .. –