Codifica un'app per Android Image Gallery con Picasso

Cosa starai creando

Picasso è una popolare libreria Android open source per il caricamento di immagini locali e remote. Scopri come utilizzarlo facilmente per gestire le esigenze di caricamento delle immagini. 

1. Che cos'è Picasso?

Picasso (nome ispirato al famoso artista francese Pablo Picasso) è una libreria Android open source molto popolare per il caricamento delle immagini nell'app per Android. Secondo i documenti ufficiali, afferma:

... Picasso consente il caricamento delle immagini senza problemi nell'applicazione, spesso in un'unica riga di codice!

Si noti che Picasso utilizza OkHttp (una libreria di rete dello stesso sviluppatore) sotto il cofano per caricare le immagini su Internet. 

2. Quindi, perché usare Picasso?

Ora hai imparato che cos'è Picasso, la prossima domanda che potresti porre è perché usarla?

Sviluppare le proprie funzionalità di caricamento e visualizzazione dei media in Java o Kotlin può essere un vero problema: bisogna occuparsi della memorizzazione nella cache, della decodifica, della gestione delle connessioni di rete, del threading, della gestione delle eccezioni e altro ancora. Picasso è una libreria facile da usare, ben pianificata, ben documentata e accuratamente testata che può farti risparmiare un sacco di tempo prezioso e risparmiarti qualche mal di testa. 

Di seguito sono riportati molti dei problemi più comuni relativi al caricamento delle immagini su Android per te da parte di Picasso, secondo i documenti ufficiali:

  • maneggio ImageView riciclaggio e cancellazione del download in un adattatore
  • trasformazioni complesse dell'immagine con un utilizzo minimo della memoria
  • memorizzazione automatica e memorizzazione nella cache del disco

L'aggiunta di immagini alla tua app può rendere viva la tua app Android. Quindi, in questo tutorial, impareremo a conoscere Picasso 2 creando una semplice applicazione per galleria di immagini. Caricherà le immagini via Internet e le visualizzerà come miniature in una RecyclerView e, quando un utente fa clic su un'immagine, aprirà un'attività di dettaglio contenente l'immagine più grande. 

Un esempio di progetto (in Kotlin) per questo tutorial può essere trovato sul nostro repository GitHub in modo da poter seguire facilmente.

I buoni artisti copiano, i grandi artisti rubano. - Pablo Picasso

3. Prerequisiti

Per poter seguire questo tutorial, avrai bisogno di:

  • una conoscenza di base delle principali API Android e Kotlin
  • Android Studio 3.1.1 o versioni successive
  • Plugin Kotlin 1.2.30 o successivo

Avvia Android Studio e crea un nuovo progetto (puoi chiamarlo PicassoDemo) con un'attività vuota chiamata Attività principale. Assicurati di controllare anche il Include il supporto Kotlin casella di controllo.

4. Dichiarare le dipendenze

Dopo aver creato un nuovo progetto, specifica le seguenti dipendenze nel tuo build.gradle. Al momento della scrittura, l'ultima versione di Picasso è 2.71828

dipendenze implementazione 'com.android.support:recyclerview-v7:27.1.1' implementazione 'com.squareup.picasso: picasso: 2.71828'

O con Maven:

 com.squareup.picasso picasso 2.71828 

Assicurati di sincronizzare il tuo progetto dopo aver aggiunto Picasso e RecyclerView artefatti V7.

5. Aggiungi autorizzazione Internet

Poiché Picasso eseguirà una richiesta di rete per caricare immagini tramite Internet, è necessario includere l'autorizzazione INTERNET nel nostro AndroidManifest.xml

Quindi vai a farlo ora!

Nota che questo è richiesto solo se hai intenzione di caricare immagini da internet. Questo non è necessario se si caricano solo le immagini localmente sul dispositivo. 

6. Creare il layout

Inizieremo creando il nostro RecyclerView dentro il activity_main.xml file di layout. 

   

Creazione del layout dell'elemento personalizzato

Quindi, creiamo il layout XML (item_image.xml) che verrà utilizzato per ciascun elemento (ImageView) all'interno del RecyclerView

   

Ora che abbiamo creato i layout necessari per la nostra semplice app di galleria, il passo successivo è creare il file RecyclerView adattatore per il popolamento dei dati. Prima di farlo, creiamo il nostro semplice modello di dati. 

7. Creare un modello di dati

Definiremo un semplice modello di dati per il nostro RecyclerView. Questo modello implementa Parcelable per il trasporto di dati ad alte prestazioni da un componente all'altro in Android. Nel nostro caso, i dati verranno trasportati da SunsetGalleryActivitySunsetPhotoActivity

classe dati SunsetPhoto (val url: String): Parcelable costruttore (parcel: Parcel): questo (parcel.readString ()) sovrascrive fun writeToParcel (parcel: Parcel, flags: Int) parcel.writeString (url) override fun describeContents (): Int return 0 oggetto associato CREATOR: Parcelable.Creator override fun createFromParcel (parcel: Parcel): SunsetPhoto return SunsetPhoto (pacco) override fun newArray (size: Int): Array return arrayOfNulls (size)

Si noti che questo modello SunsetPhoto ha solo un singolo campo chiamato url (per scopi dimostrativi), ma puoi averne di più se vuoi. Questa classe implementa Parcelable, il che significa che dobbiamo sovrascrivere alcuni metodi. 

Possiamo utilizzare Android Studio IDEA per generare questi metodi per noi, ma l'aspetto negativo è la manutenzione. Come? Ogni volta che aggiungiamo nuovi campi a questo corso, potremmo dimenticare di aggiornare esplicitamente il costruttore e writeToParcel metodi, che possono portare ad alcuni bug se non aggiorniamo i metodi.  

Ora, per aggirare l'aggiornamento o la scrittura di questi metodi, Kotlin 1.1.14 ha introdotto il @Parcelize annotazione. Questa annotazione ci aiuterà a generare il writeToParcel, writeFromParcel, e describeContents metodi automaticamente sotto la cappa per noi. 

@Parcelize classe di dati SunsetPhoto (val url: String): Parcelable

Ora, il nostro codice SunsetPhoto la classe è solo due righe! Eccezionale! 

Ricorda di aggiungere il seguente codice al modulo dell'app build.gradle:

androidExtensions experimental = true

Inoltre, ho incluso un oggetto companion (o un metodo statico in Java) getSunsetPhotos () nel SunsetPhoto classe modello che restituirà semplicemente un Lista di array di SunsetPhoto quando chiamato.

@Parcelize classe di dati SunsetPhoto (val url: String): Parcelable oggetto companion fun getSunsetPhotos (): Array return arrayOf(SunsetPhoto ("https://goo.gl/32YN2B"), SunsetPhoto ("https://goo.gl/Wqz4Ev"), SunsetPhoto ("https://goo.gl/U7XXdF"), SunsetPhoto ("https : //goo.gl/ghVPFq "), SunsetPhoto (" https://goo.gl/qEaCWe "), SunsetPhoto (" https://goo.gl/vutGmM "))

8. Creare l'adattatore

Creeremo un adattatore per popolare i nostri RecyclerView con dati. Implementeremo anche un listener di clic per aprire l'attività di dettaglio-SunsetPhotoActivity-passandogli un'istanza di SunsetPhoto come un intento extra. L'attività di dettaglio mostrerà un primo piano dell'immagine. Lo creeremo in una sezione successiva.

class MainActivity: AppCompatActivity () // ... private inner class ImageGalleryAdapter (val context: Context, val sunsetFoto: Array): RecyclerView.Adapter() override fun onCreateViewHolder (parent: ViewGroup, viewType: Int): ImageGalleryAdapter.MyViewHolder val context = parent.context val inflater = LayoutInflater.from (context) val photoView = inflater.inflate (R.layout.item_image, parent, gen, false) return MyViewHolder (photoView) override fun onBindViewHolder (titolare: ImageGalleryAdapter.MyViewHolder, posizione: Int) val sunsetPhoto = sunsetPhotos [posizione] val imageView = holder.photoImageView override fun getItemCount (): Int return sunsetPhotos.size classe interna MyViewHolder (itemView: View): RecyclerView.ViewHolder (itemView), View.OnClickListener var photoImageView: ImageView = itemView.findViewById (R.id.iv_photo) init itemView.setOnClickListener (this) override fun onClick (visualizza: Visualizza) val position = adapterPosition if (position! = RecyclerView.NO_POSITION) val sunsetPhoto = sunsetPhotos [position] val intent = Intent (context, SunsetPhotoActivity :: class.java) .apply putExtra (SunsetPhotoActivity.EXTRA_SUNSET_PHOTO, sun setPhoto) startActivity (intent)

Si noti che abbiamo usato il applicare funzione di estensione per mettere un oggetto in più rispetto all'intento. Come promemoria, il applicare la funzione restituisce l'oggetto passato ad esso come argomento (cioè l'oggetto destinatario). 

9. Caricamento di immagini da un URL

Avremo bisogno che Picasso faccia il suo lavoro in questa sezione, non per dipingerci un'opera d'arte, ma per recuperare immagini da internet e mostrarle. Mostreremo queste immagini singolarmente nei loro rispettivi ImageViews dentro il nostro RecyclerView onBindViewHolder () metodo come l'utente fa scorrere l'app. 

override fun onBindViewHolder (titolare: ImageGalleryAdapter.MyViewHolder, posizione: Int) val sunsetPhoto = sunsetPhotos [posizione] val imageView = holder.photoImageView Picasso.get () .load (sunsetPhoto.url) .placeholder (R.drawable.placeholder). errore (R.drawable.error) .fit () .into (imageView)

Passo dopo passo, ecco a cosa servono le chiamate Picasso sta facendo:

Il ottenere() Metodo

Questo restituisce il globale Picasso istanza (istanza singleton) inizializzata con le seguenti configurazioni predefinite: 

  • Memoria cache LRU del 15% della RAM dell'applicazione disponibile.
  • Cache del disco dello spazio di archiviazione 2% fino a 50 MB ma non inferiore a 5 MB. Nota: questo è disponibile solo su API 14+.
  • Tre thread di download per l'accesso al disco e alla rete.

Nota che se queste impostazioni non soddisfano i requisiti della tua applicazione, sei libero di crearne una tua Picasso istanza con il pieno controllo di queste configurazioni usando Picasso.Builder

val picassoBuilder = Picasso.Builder (contesto) // esegue configurazioni personalizzate // Specifica il @link Downloader che verrà utilizzato per scaricare le immagini. picassoBuilder.downloader () // Specifica l'ExecutorService per caricare le immagini in background. picassoBuilder.executor () // Specifica la cache di memoria utilizzata per le immagini più recenti. picassoBuilder.memoryCache () // e altro val picasso = picassoBuilder.build ()

Alla fine, chiami il costruire() metodo per restituirti un Picasso istanza con le proprie configurazioni. 

Si consiglia di farlo nel tuo Application.onCreate e quindi impostarlo come istanza singleton con Picasso.setSingletonInstance in quel metodo, per assicurarsi che il Picasso l'istanza è quella globale.

Il caricare() Metodo 

carico (percorso stringa) avvia una richiesta di immagine utilizzando il percorso specificato. Questo percorso può essere un URL remoto, una risorsa file, una risorsa di contenuto o una risorsa Android.

  • segnaposto (int placeholderResId): un id risorsa segnaposto locale o disegnabile da utilizzare mentre l'immagine viene caricata e quindi visualizzata. Serve come una buona esperienza utente per visualizzare un'immagine segnaposto mentre l'immagine è in fase di download.  

Si noti che Picasso controlla innanzitutto se l'immagine richiesta si trova nella cache di memoria e, in caso affermativo, visualizza l'immagine da lì (discuteremo più sulla memorizzazione nella cache di Picasso in una sezione successiva).

Altri metodi

  • errore (int errorResId): un drawable da utilizzare se l'immagine richiesta non può essere caricata, probabilmente perché il sito web è inattivo. 
  • noFade (): Picasso sfuma sempre l'immagine per essere visualizzata nel ImageView. Se non vuoi questa animazione con dissolvenza, chiama semplicemente il noFade () metodo. 
  • in (ImageView imageView): la vista dell'immagine di destinazione in cui verrà posizionata l'immagine.

Ridimensionamento e trasformazione dell'immagine

Se il server da cui stai richiedendo l'immagine non ti dà l'immagine che ti serve nella dimensione richiesta, puoi facilmente ridimensionarla usando ridimensiona (int targetWidth, int targetHeight). La chiamata a questo metodo ridimensiona l'immagine e quindi la visualizza sul ImageView. Si noti che le dimensioni sono espresse in pixel (px), non in dp. 

Picasso.get () .load (sunsetPhoto.url) .placeholder (R.drawable.placeholder) .resize (400, 200) .into (imageView)

Puoi passare una risorsa di dimensione Android sia per la larghezza che per l'altezza utilizzando il metodo resizeDimen (int targetWidthResId, int targetHeightResId). Questo metodo converte la dimensione della dimensione in pixel non elaborati e quindi chiama ridimensionare () sotto il cofano - passando le dimensioni convertite (in pixel) come argomenti. 

Picasso.get () // ... resizeDimen (R.dimen.list_detail_image_size, R.dimen.list_detail_image_size) // ... 

Nota che questi metodi di ridimensionamento non rispetteranno le proporzioni. In altre parole, le proporzioni dell'immagine possono essere distorte. 

per fortuna, Picasso ci dà alcuni metodi utili per risolvere questo problema: 

  • centerCrop (): Ridimensiona l'immagine in modo uniforme (mantenendo le proporzioni dell'immagine) in modo che l'immagine riempia l'area specificata, mostrando la maggior parte dell'immagine possibile. Se necessario, l'immagine verrà ritagliata orizzontalmente o verticalmente per adattarsi. Chiamando questo metodo si ritaglia un'immagine all'interno dei limiti specificati da ridimensionare ().
  • centerInside (): ridimensiona l'immagine in modo che entrambe le dimensioni siano uguali o inferiori ai limiti richiesti. Questo centrerà un'immagine all'interno dei limiti specificati da ridimensionare ()
  • onlyScaleDown (): ridimensiona un'immagine solo se la dimensione dell'immagine originale è maggiore della dimensione target specificata da ridimensionare ().
  • in forma(): tenta di ridimensionare l'immagine per adattarla esattamente al target ImageViewI limiti.

Rotazione dell'immagine

Picasso ha una semplice API per ruotare un'immagine e quindi visualizzare quell'immagine. Il ruota (gradi float) metodo ruota l'immagine in base ai gradi specificati.

Picasso.get () // ... rotate (90f) // ... 

Nell'esempio sopra, questo ruoterebbe l'immagine di 90 gradi. Il ruotare (gradi flottanti, pivotX flottante, pivoty flottante) metodo ruota l'immagine di gradi specificati attorno a un punto di rotazione.

Picasso.get () // ... rotate (30f, 200f, 100f) // ... 

Qui andremo a ruotare l'immagine di 30 gradi attorno al punto di rotazione 200, 100 pixel. 

Trasformazione

Oltre a manipolare semplicemente un'immagine ruotandola, Picasso ci offre anche la possibilità di applicare una trasformazione personalizzata a un'immagine prima di visualizzarla.  

Devi semplicemente creare una classe che implementa Picasso Trasformazione interfaccia. Devi quindi sostituire due metodi: 

  • Trasformazione bitmap (origine bitmap): trasforma la bitmap di origine in una nuova bitmap. 
  • Chiave stringa (): restituisce una chiave univoca per la trasformazione, utilizzata per scopi di memorizzazione nella cache.

Dopo aver terminato la creazione della trasformazione personalizzata, è sufficiente eseguirla invocando transform (Trasformazione trasformazione) sulla tua istanza di Picasso. Si noti che è anche possibile passare un elenco di Trasformazionetrasformare()

Picasso.get () // ... transform (CropCircleTransformation ()) .into (imageView)

Qui, ho applicato una trasformazione del crop circle all'immagine dalla libreria Android open source di Picasso Transformations. Questa libreria ha molte trasformazioni che puoi applicare a un'immagine con Picasso, comprese le trasformazioni per la sfocatura o il ridimensionamento in grigio di un'immagine. Vai a dare un'occhiata se vuoi applicare alcune fantastiche trasformazioni alle tue immagini.  

10. Inizializzazione dell'adattatore

Qui, semplicemente creiamo il nostro RecyclerView con GridLayoutManager come gestore del layout, inizializzare il nostro adattatore e collegarlo al RecyclerView

class MainActivity: AppCompatActivity () private lateinit var recyclerView: RecyclerView private lateinit var imageGalleryAdapter: ImageGalleryAdapter sovrascrive fun onCreate (savedInstanceState: Bundle?) // ... val layoutManager = GridLayoutManager (this, 2) recyclerView = findViewById (R.id.rv_images ) recyclerView.setHasFixedSize (true) recyclerView.layoutManager = layoutManager imageGalleryAdapter = ImageGalleryAdapter (questo, SunsetPhoto.getSunsetPhotos ()) sostituisce il divertimento onStart () super.onStart () recyclerView.adapter = imageGalleryAdapter // ...

11. Creazione dell'attività di dettaglio

Crea una nuova attività e nominala SunsetPhotoActivity. Otteniamo il SunsetPhoto extra e caricare l'immagine all'interno onStart ()-con Picasso come abbiamo fatto prima. 

class SunsetPhotoActivity: AppCompatActivity () oggetto associato const val EXTRA_SUNSET_PHOTO = "SunsetPhotoActivity.EXTRA_SUNSET_PHOTO" private lateinit var imageView: LateView privato di image var sunsetPhoto: SunsetPhoto sovrascrive fun onCreate (savedInstanceState: Bundle?) super.onCreate (savedInstanceState) setContentView ( R.layout.activity_sunset_photo) sunsetPhoto = intent.getParcelableExtra (EXTRA_SUNSET_PHOTO) imageView = findViewById (R.id.image) override fun onStart () super.onStart () Picasso.get () .load (sunsetPhoto.url) .placeholder (R.drawable.placeholder) .error (R.drawable.error) .fit () .into (imageView)

Il layout dei dettagli

Ecco un layout per visualizzare l'attività di dettaglio. Visualizza solo un ImageView che mostrerà la versione a piena risoluzione dell'immagine caricata. 

   

12. Meccanismo di memorizzazione nella cache in Picasso

Se osservi attentamente, noterai che quando rivedi un'immagine che è stata caricata in precedenza, carica ancora più velocemente di prima. Cosa lo ha reso più veloce? È il meccanismo di caching di Picasso, ecco cosa.

Ecco cosa sta succedendo sotto il cofano. Dopo che un'immagine è stata caricata una volta da Internet, Picasso lo memorizzerà nella cache sia in memoria che su disco, salvando le richieste di rete ripetute e consentendo il recupero più rapido dell'immagine. Quando l'immagine sarà nuovamente necessaria, Picasso verificherà innanzitutto se l'immagine è disponibile in memoria e, se è presente, la restituirà immediatamente. Se quell'immagine non è in memoria, Picasso controllerà il disco successivo e, se è lì, lo restituirà. Se non è lì, Picasso finalmente farà una richiesta di rete per quell'immagine e la mostrerà. 

In sintesi, ecco cosa succede (sotto il cofano) per una richiesta di immagine: memoria -> disco -> rete. 

A seconda dell'applicazione, tuttavia, è possibile evitare la memorizzazione nella cache, ad esempio se è probabile che le immagini visualizzate cambino spesso e non vengano ricaricate.

Quindi, come si disabilita la memorizzazione nella cache? 

È possibile evitare il caching della memoria chiamando memoryPolicy (MemoryPolicy.NO_CACHE). Questo semplicemente salterà la ricerca della cache di memoria durante l'elaborazione di una richiesta di immagine. 

Picasso.get () .load (sunsetPhoto.url) .placeholder (R.drawable.placeholder) .error (R.drawable.error) .fit () .memoryPolicy (MemoryPolicy.NO_CACHE) .into (imageView)

Nota che c'è un'altra enumerazione: MemoryPolicy.NO_STORE. Questo è utile se sei assolutamente certo che richiedi un'immagine solo una volta. L'applicazione di questo non memorizzerà l'immagine nella cache di memoria, quindi non forzerà altri bitmap dalla memoria cache. 

Ma sappi che l'immagine sarà ancora memorizzata nella cache del disco, per evitare che anche tu usi networkPolicy (politica @NonNull NetworkPolicy, @NonNull NetworkPolicy ... aggiuntivo), che prende uno o più dei seguenti valori enum:

  • NetworkPolicy.NO_CACHE: salta la cache del disco e forza il caricamento attraverso la rete.
  • NetworkPolicy.NO_STORE: salta la memorizzazione del risultato nella cache del disco.
  • NetworkPolicy.OFFLINE: forza la richiesta solo attraverso la cache del disco, saltando la rete.

Per evitare del tutto la memoria e il caching del disco, basta chiamare entrambi i metodi uno dopo l'altro:

Picasso.get () .load (sunsetPhoto.url) .placeholder (R.drawable.placeholder) .error (R.drawable.error) .fit () .memoryPolicy (MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) .networkPolicy (NetworkPolicy. NO_CACHE) .into (imageView)

13. Richiedi ascoltatori

In Picasso, è possibile implementare un listener o un callback per monitorare lo stato della richiesta effettuata mentre l'immagine viene caricata. Solo uno di questi metodi verrà chiamato se si implementa il Bersaglio interfaccia su richiesta. 

  • void onBitmapFailed (e: Exception ?, errorDrawable: Drawable?): attivato ogni volta che l'immagine non può essere caricata con successo. Qui, possiamo accedere all'eccezione che è stata lanciata. 
  • void onBitmapLoaded (Bitmap bitmap, LoadedFrom from): attivato ogni volta che un'immagine è stata caricata correttamente. Qui, otteniamo la bitmap per mostrare all'utente. 
  • void onPrepareLoad (Drawable placeHolderDrawable): invocato appena prima che la richiesta venga inviata. 
Picasso.get () .load (sunsetPhoto.url) .placeholder (R.drawable.placeholder) .error (R.drawable.error) .into (oggetto: Target override fun onPrepareLoad (placeHolderDrawable: Drawable?)  Override fun onBitmapFailed (e: Exception ?, errorDrawable: Drawable?)  override fun onBitmapLoaded (bitmap: Bitmap ?, da: Picasso.LoadedFrom?) )

Qui puoi anche mostrare e nascondere una finestra di avanzamento se ne hai una. 

C'è un altro listener di callback che puoi implementare se vuoi, chiamato Richiama. Questa interfaccia ha solo due metodi: onSuccess ()onError (Exception e). Il primo viene chiamato quando il caricamento della richiesta di immagini ha avuto esito positivo e il successivo viene chiamato quando si verifica un errore nell'elaborazione della richiesta. 

Tornando alla nostra app galleria di immagini (all'interno SunsetPhotoActivity), modifichiamo un po 'il display usando a Richiama oggetto che imposterà la bitmap sul ImageView e cambia anche il colore di sfondo del layout estraendo il colore scuro e vibrante della nostra immagine utilizzando l'API della palette Android. 

Quindi includi l'artefatto della tavolozza nel modulo dell'app build.gradle:

dipendenze // ... implementazione 'com.android.support:palette-v7:27.1.1'

Ora implementiamo il Richiama interfaccia nella nostra richiesta Picasso. 

override fun onStart () super.onStart () Picasso.get () .load (sunsetPhoto.url) .placeholder (R.drawable.placeholder) .error (R.drawable.error) .fit () .into (imageView, object: Callback override fun onSuccess () val bitmap = (imageView.drawable come BitmapDrawable) .bitmap onPalette (Palette.from (bitmap) .generate ()) override fun onError (e: Exception?)  divertimento onPalette (palette: Palette?) if (null! = palette) val parent = imageView.parent.parent come ViewGroup parent.setBackgroundColor (palette.getDarkVibrantColor (Color.GRAY))

14. Testare l'app

Finalmente puoi eseguire l'app! Fare clic su una miniatura per ottenere una versione completa dell'immagine.

15. Priorità alle richieste

Quando si desidera caricare contemporaneamente diverse immagini sullo stesso schermo, è possibile ordinare quale è più importante dell'altro. In altre parole, puoi caricare prima le immagini importanti. 

Basta chiamare priorità() sulla tua istanza di richiesta di Picasso e passa una qualsiasi delle enumerazioni: Priority.LOW, Priority.NORMAL, o Priority.HIGH

Picasso.get () .load (sunsetPhoto.url) .placeholder (R.drawable.placeholder) .error (R.drawable.error) .fit () .priority (Picasso.Priority.HIGH) .into (imageView) Picasso. get () .load (sunsetPhoto.url) .placeholder (R.drawable.placeholder) .error (R.drawable.error) .fit () .priority (Picasso.Priority.NORMAL) .into (imageView) Picasso.get ( ) .load (sunsetPhoto.url) .placeholder (R.drawable.placeholder) .error (R.drawable.error) .fit () .priority (Picasso.Priority.LOW) .into (imageView)

16. Richieste di tagging

Contrassegnando le richieste Picasso, è possibile riprendere, sospendere o annullare le richieste associate a tag specifici. A seconda del tuo caso d'uso, puoi taggare le tue richieste con una stringa o oggetti che dovrebbero definire l'ambito della richiesta come a Contesto, un Attività, o a Frammento. Puoi facilmente taggare una richiesta Picasso chiamando tag (@NonNull Tag dell'oggetto) nessuno. Passa un esempio di Oggetto che funge da tag. 

Ecco le seguenti operazioni che puoi eseguire sulle richieste Picasso con tag:

  • pauseTag (tag dell'oggetto): mette in pausa tutte le richieste associate al tag specificato. 
  • resumeTag (tag dell'oggetto): riprende le richieste in pausa con il tag specificato.
  • cancelTag (tag dell'oggetto): annulla qualsiasi richiesta esistente con il tag specificato.
Picasso.get () // ... tag (contesto

Sebbene la codifica delle tue richieste ti dia un certo controllo sulle tue richieste, dovresti stare molto attento quando usi i tag a causa della potenziale perdita di memoria. Ecco cosa dice la documentazione ufficiale:

Picasso manterrà un riferimento al tag per tutto il tempo in cui questo tag è in pausa e / o ha richieste attive. Cerca potenziali perdite.

Caricamento dal file system

È semplice caricare le immagini localmente nella tua app.

File file = nuovo File ("il tuo / pic / file / percorso / file.png") Picasso.get () .load (file) .fit () .into (imageView)

Conclusione

Bel lavoro! In questo tutorial, hai realizzato un'app completa per la galleria di immagini con Picasso e lungo il percorso hai imparato come funziona la libreria e come puoi integrarla nel tuo progetto. 

Hai anche imparato a visualizzare sia le immagini locali e remote, taggare le richieste, dare priorità alle richieste e come applicare le trasformazioni di immagine come il ridimensionamento. Non solo, ma hai visto quanto sia facile abilitare e disabilitare il caching, la gestione degli errori e i listener delle richieste personalizzate. 

Per saperne di più su Picasso, puoi fare riferimento alla sua documentazione ufficiale. Per ulteriori informazioni sulla codifica per Android, consulta alcuni dei nostri altri corsi e tutorial qui su Envato Tuts+!