Está en la página 1de 24

Universidad Nacional de La

Matanza
Android
Librerías
Agenda

Picasso

GSON

Retrofit
Picasso
Picasso
Si bien haremos el manejo de imágenes y requests HTTP con librerías, primero
es necesario comprender los problemas que estas resuelven.

Threads en Android

Main Thread (UI)

Background

AsyncTask

Manejo de imágenes (1 pixel = 4 bytes, ARGB_8888 -> OutOfMemoryError)


Picasso

Simplifica y automatiza el proceso de:

● Descargar una imagen


● Transformarla para minimizar el uso de memoria
● Manejar el cache en memoria y en disco
● Cancelar las descargas que se encuentran en progreso cuando el View ya
no está visible
● No sólo carga imágenes desde una URL: también sirve para cargar
imágenes que se encuentran almacenadas en forma local.
Picasso
● Importar la librería

implementation 'com.squareup.picasso:picasso:2.71828'

● Agregar en AndroidManifest.xml el permiso para utilizar Internet.

<uses-permission android:name="android.permission.INTERNET" />


● Uso básico
Picasso.get()
.load("http://...")
.into(imagen)
Picasso

Features interesantes:

● Reintenta 3 veces antes de mostrar la imagen de error


● .placeholder(R.drawable.img_holder)
● .error(R.drawable.img_error)
● Ver de dónde vienen las imágenes mostradas
.setIndicatorsEnabled(true)
GSON
GSON

● Formato JSON.
● GSON facilita la tarea de serializar y deserializar objetos en este formato.
● Para ello es necesario crear una clase Kotlin que se mapee con el modelo
que el JSON defina. Ejemplo: Artículo
GSON

● Si bien GSON es una librería independiente, generalmente la utilizaremos


en conjunto con Retrofit, por eso su dependencia es un poco distinta:

implementation 'com.squareup.retrofit2:converter-gson:2.6.2'

● Se crea una clase que represente el objeto JSON


● El nombre del atributo de nuestra clase puede ser distinto al que lleva en el
JSON.
@SerializedName("sold_quantity")
private soldQuantity: Long = 0
GSON: Uso

● Convertir un Objeto a JSON


val gson = Gson()
val json = gson.toJson(article)
● Convertir JSON a un Objeto

val newArticle = gson.fromJson("{\"title\":\"Un artículo nuevo\"}", Article::class.java)


● Convertir un JSONArray a una lista de Objetos
val listType = object : TypeToken<ArrayList<Article>>() {}.type
val articles = Gson().fromJson(jsonArray, listType)
GSON: Uso

● Y si un objeto viene serializado en un formato que GSON no es capaz de


deserializar automáticamente? Ejemplo típico: fechas.

val gsonBuilder = GsonBuilder()


val gson = gsonBuilder
.setDateFormat(FORMATO_FECHA)
.registerTypeAdapter(Entidad::class.java,EntidadDeserializer())
.create()
GSON: Uso

class EstadoContactoDeserializer : JsonDeserializer<EstadoContacto> {

@Throws(JsonParseException::class)
fun deserialize(json: JsonElement,
typeOfT: Type,
context: JsonDeserializationContext
): EstadoContacto {
return EstadoContacto.desde(json.asInt)
}

}
Retrofit
Retrofit

● Librería para realizar HTTP requests de forma segura, sin tener que lidiar
con AsyncTasks, complejidad de threading, parseo de entidades en el
main-thread y casos de error.
● Internamente maneja GSON y adaptadores de otros formatos (por
ejemplo, XML).
● Su simpleza radica en que permite mapear una API completa a una
interface Kotlin, que luego se instancia para utilizarse como métodos de
una clase común y corriente.
Retrofit

● Importar la librería

implementation 'com.squareup.retrofit2:retrofit:2.6.2'
Retrofit

● Escribir una interface que describa los recursos del la API


interface MercadoLibreAPI {

@GET("items/{itemId}")

fun getArticle(@Path("itemId") id: String): Call<Article>

@GET("sites/MLA/search")

fun search(@Query("q") query: String): Call<SearchResult>


Retrofit: uso
class API {

private fun getAPI() : MercadoLibreAPI {

val retrofit = Retrofit.Builder()

.addConverterFactory(GsonConverterFactory.create( Gson() ))

.baseUrl("https://api.mercadolibre.com/")

.build();

return retrofit.create(MercadoLibreAPI::class.java)

}
Retrofit: uso
class API {

fun getArticle(id: String, callback: Callback<Article>) {

getAPI().getArticle(id).enqueue(callback)

}
Retrofit: ejemplo de uso
API().getArticle("MLA644287324", object:Callback<Article> {

override fun onFailure(call: Call<Article>, t: Throwable) {

...

override fun onResponse(call: Call<Article>, response: Response<Article>) {

if (response.isSuccessful) {

val received = response.body()

}
})
¿Preguntas?
Práctica
Fin

También podría gustarte