Recientemente me convertí en un fan de Android Kotlin y me convertí. Luego leí sobre las corrutinas y pensé que todas mis Navidades geek habían llegado a la vez.
Las corrutinas en Kotlin permiten tareas asincrónicas sencillas. Con unas pocas líneas podemos realizar llamadas asincrónicas y obtener su respuesta
-- PRESENTER
fun getListOfThings() {
launch(Android) {
asyncTask { storageHelper.getListFromDb() }.await()
.let { list ->
view.useTheResult(list)
}
}
}
fun <T> asyncTask(function: () -> T): Deferred<T> {
return async(CommonPool) { function() }
}
Ahora queremos hacer una prueba unitaria del método getListOfThings . Primero tenemos el problema de la burla de que las clases y métodos de Kotlin son definitivos por defecto. No está mal (ábrelos o usa las últimas funciones de Mockito para burlarse del final).
En mi implementación asíncrona anterior (RxJava), puede cambiar fácilmente los programadores para la prueba, convirtiéndolo en asíncrono en síncrono para fines de prueba. Esto resultó imposible usando corrutinas.
En cambio, tuve que adoptar un enfoque diferente ... primero, escriba una prueba unitaria para getListOfThings :
-- TEST
@Test
fun getPackageFiltersForWidget() {
val list: ArrayList<PackageFilter> = ArrayList()
`when`(storageHelper.getListFromDb()).thenReturn(list)
presenter.getListOfThings()
Mockito.verify(view).useTheResult(ArgumentMatchers.eq(list))
}
-- PRESENTER
fun getListOfThings() {
launch(Android) {
asyncTask { storageHelper.getListFromDb() }.await()
.let { list ->
view.useTheResult(list)
}
}
}
fun <T> asyncTask(function: () -> T): Deferred<T> {
return async(CommonPool) { function() }
}
-- ACTIVITY
fun getList() {
presenter.getListOfThings()
}
Lo que tenemos que hacer es mover la sección de lanzamiento (Android) fuera del presentador, para que podamos probar solo la lógica. Pero no queremos que se llame al método del presentador en el subproceso de la interfaz de usuario.
Ingrese la palabra clave suspend y ejecuteBlocking :
-- TEST
@Test
fun getPackageFiltersForWidget() {
val list: ArrayList<PackageFilter> = ArrayList()
`when`(storageHelper.getListFromDb()).thenReturn(list)
runBlocking {
presenter.getListOfThings()
}
Mockito.verify(view).useTheResult(ArgumentMatchers.eq(list))
}
-- PRESENTER
suspend fun getListOfThings() {
asyncTask { storageHelper.getListFromDb() }.await()
.let { list ->
view.useTheResult(list)
}
}
fun <T> asyncTask(function: () -> T): Deferred<T> {
return async(CommonPool) { function() }
}
-- ACTIVITY
fun getList() {
launch(Android) {
presenter.getListOfThings()
}
}
Se obtiene el mismo error dentro de la prueba, por lo rodean a la llamada a la getListOfThings método con runBlocking .
Si ejecutamos la prueba ahora, todo verde ... ¡yay!
Las corrutinas solo están disponibles en Kotlin 1.1, que (al momento de escribir este artículo) está en RC.
Deberá configurar su proyecto para usar 1.1 y luego agregar la siguiente importación
compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.11-rc"
Una guía paso a paso para migrar de Dagger a Hilt en un proyecto de varios módulos. Estructura del proyecto Para visualizar el proyecto, contiene varios módulos NetworkModule, StorageModule, CommonModule, FeatureModule, etc.
Google actualizó recientemente su aplicación de teclado Gboard para Android para incluir un nuevo diseño optimizado para tabletas. Esta mañana me di cuenta de que tenía algunas dificultades para escribir y, tras una inspección más detallada, me di cuenta de que se había cambiado el teclado.
Cuando creces, tiendes a que te digan que el mundo es como es y que tu vida es solo vivir tu vida dentro del mundo, nunca arriesgar tu vida, solo sigue un camino establecido y muere al final, y trata de no hacerlo. golpea demasiado las paredes. Pero esa es una vida muy limitada.
Cuando realiza una solicitud a facebook.com, su computadora busca el nombre de dominio para traducir ese nombre de dominio en una dirección IP para que su computadora pueda hacer esa conexión.
Si queremos seguir prosperando en este planeta, vamos a tener que tener conversaciones peligrosas. Aquellas que desafían lo que hemos hecho, lo que estamos haciendo y lo que actualmente vamos a seguir haciendo (o planeamos hacer).
La semana pasada noté un comunicado de prensa, enviado a través de PressGazette (un sitio web de noticias de los medios británicos). El artículo anunciaba que Acast, la empresa de publicidad y alojamiento de podcasts de Scandi, lideraría un consorcio de editores "probablemente los más influyentes" en podcasting.