Registrar un observador frente a configurar un controlador

Una diferencia crucial que debe tener en cuenta es que LiveDatasabe cuándo un observador se adhiere a él y puede emitir inmediatamente un valor si LiveDataestá listo. Por ejemplo, si su vista se separa y se vuelve a conectar al mismo ViewModel debido a algún cambio de configuración, LiveDatapuede emitir inmediatamente un valor y, por lo tanto, su vista puede restaurar el estado sin problemas. No puede hacer esto con la interfaz, y lo mejor que puede hacer con la interfaz es verificar si el controlador es nulo cada vez que lo llama para evitar que la aplicación se bloquee.

También tus dos puntos:

  1. No está realmente claro qué debería desencadenar cada elemento strng / enum. Puede darles valores / nombres de sugerencias legibles, pero de todos modos no es como un nombre de método con cadenas de documentos adecuadas
  2. Puede enviar argumentos adicionales en paquetes, pero no es como la firma del método adecuado con tipos, etc.

Son correctos, excepto que ambos RxJavay LiveDatapueden manejar fácilmente este problema, ya que son problemas de diseño, en lugar de las herramientas. Por ejemplo, su Eventclase podría verse así:

class Event(event: String, data: Bundle)

No hagas esto. Una mejor manera de hacerlo:

abstract class Event()

class DoneThisEvent(how:How, when:Time): Event()
class DoneThatEvent(location:Location, withWho:Person): Event()


Además, debe estar pensando en las dependencias entre los eventos. En otras palabras, ¿pueden coexistir el evento "I did This" y el evento "I did That" al mismo tiempo? Comparar la LiveDataimplementación dada y la ViewModelEventsHandlerimplementación no es justo, porque en la LiveDataimplementación, sugiere que estos dos eventos no pueden coexistir, mientras que en la ViewModelEventsHandlerimplementación sí pueden. Comparemos ambos escenarios:

Si dos eventos no pueden coexistir

Entonces su LiveDataejemplo tiene sentido, pero aún hay margen de mejora:

viewModel.iDidThisAndThat.observe(this, Observer { done ->
    when(done) {
        is DoneThisEvent -> handleViewModelDidThis(done.how, done.when) // Notice the automatic type casting
        is DoneThatEvent -> handleViewModelDidThat(done.location, done.withWho)
    }
})

También verifique su ViewModelEventsHandlercontraparte.

viewModel.eventsHandler = ViewModelEventsHandler {

    override fun viewModelDidThisAndThat(done: Event) {
        when(done) {
            is DoneThisEvent -> handleViewModelDidThis(done.how, done.when) // Notice the automatic type casting
            is DoneThatEvent -> handleViewModelDidThat(done.location, done.withWho)
        }
    }
}

Como puede ver, no hay diferencia entre ellos, excepto que ViewModelEventsHandlernecesita verificar manualmente y anular adjuntar / separar los controladores de eventos.


Si dos eventos pueden coexistir

Si dos eventos son independientes, entonces deben observarse independientemente.

// In activity onCreate
viewModel.iDidThis.observe(this, Observer { doneThis ->
    handleViewModelDidThis(doneThis.how, doneThis.when)
})

viewModel.iDidThat.observe(this, Observer { doneThat ->
    handleViewModelDidThat(doneThat.location, doneThat.withWho)
}



// In your ViewModel
val iDidThis: LiveData<DoneThisEvent>
val iDidThat: LiveData<DoneThatEvent>

Esta LiveDataimplementación no debería verse más fea o menos manejable que su ViewModelEventsHandlercontraparte:

viewModel.eventsHandler = ViewModelEventsHandler {
    override fun viewModelDidThis(String how, Date when) {
        handleViewModelDidThis(how, when)
    }

    override fun viewModelDidThis(Location where, List<Friends> withWho) {
        handleViewModelDidThat(where, withWho)
    }
}
Respuesta 1

Estoy usando la API del extractor de metadatos para extraer metadatos de una imagen. Luego estoy usando Java para crear un archivo .txt con todos los datos. Sin embargo, cuando ejecuto el archivo, tengo nullpointexception. Lo sé ...

Estoy creando CreateOrUpdateProduct API uso Spring boot. Quiero volver al consumidor dos campos ('mensaje e isOk'). Pero cuando ejecuto esta API, recibí los campos ('mensaje y ok'). que es ...

Agregué un archivo como parte de los activos públicos del proyecto: public / style / style.css, esta es la ruta para los activos públicos en el archivo de rutas: # Asigna recursos estáticos de la carpeta / public a / assets ...

Tengo un programa de lotería que ejecutará apuestas y generará números al azar. Cuando el usuario alcanza $ 5000 en ganancias totales, ese usuario tendrá la opción de retirar $ 5000 y usar el saldo restante para ...