【Jetpack】LiveData

1 ¿Cuál es la diferencia entre setValue() y postValue()?
2 ¿Cómo percibe liveData el ciclo de vida?
3 ¿Por qué el postValue() continuo pierde datos?
4 ¿Livedata es pegajoso?
5 ¿Por qué LiveData está diseñado para ser pegajoso?

1. ¿Qué es LiveData?

Clases de almacenamiento de datos observables con tiempo de vida consciente

2. Escenarios de uso de LiveData

Usados ​​dentro de ViewModel, los datos impulsan la actualización de la vista a través del observador, lo que reduce el umbral de MVVM.

3. Ventajas de LiveData

ciclo de vida de la percepción

  • Siga el ciclo de vida de otros componentes de la aplicación, como actividad, fragmento o servicio. Esta conciencia garantiza que LiveData solo actualice los observadores de los componentes de la aplicación que se encuentran en un estado de ciclo de vida activo.
  • LiveData considera que un observador (representado por la clase Observer) está activo si su ciclo de vida está en estado INICIADO o REANUDADO. LiveData solo notificará a los observadores activos sobre las actualizaciones. Los observadores inactivos registrados para observar objetos LiveData no reciben notificación de los cambios.
    Asegúrese de que la interfaz se ajuste al estado de los datos y que los datos estén siempre actualizados
  • Para garantizar que los datos estén actualizados, el propósito de LiveData es garantizar que la última parte de los datos esté actualizada, por lo que es normal que los datos se pierdan cuando se modifican (el escenario de usando postValue() continuamente). Después de todo, solo garantiza los últimos datos.
  • Los cambios de configuración apropiados también pueden garantizar datos actualizados. Si se vuelve a crear una actividad o un fragmento debido a un cambio de configuración, como la rotación de un dispositivo, recibe inmediatamente los últimos datos disponibles. ViewModel tiene un ciclo de vida relativamente largo y se guardará en este escenario. Después del cambio, se evaluará la versión interna de livedata para garantizar los datos más recientes.
    No habrá fugas de memoria, bloqueos debido a la detención de la actividad y no será necesario manejar manualmente el ciclo de vida.
  • El observador de livedata está vinculado al objeto Lifecycle. Al salir, se encargará automáticamente de la desvinculación.
    Recursos compartidos
  • Puede extender el objeto LiveData utilizando el patrón singleton para encapsular los servicios del sistema para que puedan compartirse entre aplicaciones. Un objeto LiveData se conecta al servicio del sistema una vez, y luego cualquier observador que necesite el recurso correspondiente simplemente observa el objeto LiveData. Consulte Ampliación de LiveData para obtener más información.

4. Uso básico

paso 1 Declarar un LiveData

class NameViewModel : ViewModel() {
    
    

    val currentName: MutableLiveData<String> by lazy {
    
    
        MutableLiveData<String>()
    }
}

paso 2 iniciar suscripción

observar 和 observar para siempre

class NameActivity : AppCompatActivity() {
    
    

    // Use the 'by viewModels()' Kotlin property delegate
    // from the activity-ktx artifact
    private val model: NameViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
    
    
        super.onCreate(savedInstanceState)

        // Other code to setup the activity...

        // Create the observer which updates the UI.
        val nameObserver = Observer<String> {
    
     newName ->
            // Update the UI, in this case, a TextView.
            nameTextView.text = newName
        }

        // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
        model.currentName.observe(this, nameObserver)

        model.currentName.observe(this) {
    
    
            Log.d("TAG", "LiveData: $it")
        }

        model.currentName.observeForever {
    
    
            Log.d("TAG", "Forever LiveData: $it")
        }
    }
}

paso 3 actualizar datos

setValue y postValue

//主线程调用 setValue()
model.currentName.setValue(anotherName)
//子线程调用 postValue()
model.currentName.postValue(anotherName)

5. Precauciones

5.1 setValue() debe estar en el hilo principal

java.lang.IllegalStateException: no se puede invocar setValue en un subproceso de fondo

5.2 Llamando a postValue() continuamente, el valor intermedio será descartado

Se debe prestar atención a los escenarios que necesitan obtener el estado del valor de cada momento, como el seguimiento de la barra de progreso, etc.

5.3 Problema de reflujo de datos de LiveData

LiveData es fijo de forma predeterminada, lo que se puede lograr modificando mLastVersion

Supongo que te gusta

Origin blog.csdn.net/Android_yh/article/details/130303773
Recomendado
Clasificación