-
View : Se encarga de mostra la UI al suario final, está subscrito a observers del viewmodel, está compuesto por una UI-Controller y la vista, inicialmente esta pensado que la UI-Controller sea el Activity|Fragment , pero no necesariamente es así, hay muchas maneras de implementarlo, una recomendación es utilizar una interfaz por view para mantener el codigo organizado dependiendo de la complejida que este tenga.
-
View model: Se encarga interactuar con la modelo y notificarle los cambios a la UI-Controller, esta capa está subscrita al lifecycle de la Activity|Fragment|Servicio que la utiliza para mantener siempre la consistencia de los datos.
-
Model: Es la capa abstracta que le provee los datos al viewmodel sin importar de donde vengan ya sea de BD|API|Cache|Almacenamiento local.
Librerias que forman parte del JetPack de android de Google para crear apps más estables y faciles de mantener.
En este ejemplo se utilizó:
-
ViewModel: explicado anteriormente
-
LiveData: Es una clase que hereda de observers y se subscribe al lifecycle de la app para asegurarse que solo funcione durante el lifecycle de la Activity,Fragment o Servicio que lo está ejecutando.
-
Databinding: Se utiliza para facilitar el uso de la vista, puedes pasarle variables desde cualquier interfaz esto facilita la reutilización de código (DRY) ejemplo: Digamos que tienes una vista que muestra la informacion de un usuario, nombre, apellidos, foto etc.... cada vez que la utilices tendrías que hacer algo como:
name.text = user.name lastName.text = user.lastname foto.load = user.avatar
en cambio si le pasas el objeto usuario a la vista ya ella se encaga de eso sin importar de donde venga.
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="user" type="com.ejemplo.model.User"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="match_parent" android:layout_marginTop="2dp" android:layout_marginStart="5dp" style="@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle" android:layout_height="wrap_content" android:text="@{user.lastName}"/> <ImageView android:layout_width="match_parent" style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" android:layout_height="wrap_content" app:imageUrl="@{user.avatar}" /> </LinearLayout> </layout>
Note: app:imageUrl="@{user.avatar}" es un BindingAdapter:
@BindingAdapter(value = ["app:imageUrl", "app:placeholderResource", "app:errorResource"], requireAll = false) fun setLoadImage( imageView: ImageView, imageUrl: String, placeholderResource: Int? = null, errorResource: Int? = null ) { loadImage(Picasso.get().load(imageUrl), imageView, placeholderResource, errorResource) } private fun loadImage( piccasoCreator: RequestCreator?, imageView: ImageView, placeholderResource: Int?, errorResource: Int? ) { if (placeholderResource != null) piccasoCreator!!.placeholder(placeholderResource) if (errorResource != null) piccasoCreator!!.error(errorResource) piccasoCreator!!.into(imageView) }
Las posibilidades de Databinding son muy variadas, puedes pasarle todo tipo de objectos e incluso usar livedata en la vista para mantenerla actualizada.
-
Paging: Es un adapter que hereda de RecyclerView.Adapter y nos permite cargar datos paginados de está manera la vista tiene un comportamiento más fluido.
-
Room: base de datos SQLite, generalmente utilizada para crear una caché de tus datos y cargarlos de manera persistente, muy útil para el trabajo con paging.
-
WorkManager: manejo de tareas en segundo plano.
##Tambien deberías ver Android JetPack by Google