Combate real de los componentes de la arquitectura de Android——ViewModel+LiveData

Entre los componentes de la arquitectura de Android proporcionados oficialmente por Google, se encuentran ViewModel, LiveData, Lifecycle, DataBinding, etc., que juntos forman una arquitectura MVVM completa, separan la vista y la lógica comercial y brindan una administración amigable del ciclo de vida. Este artículo no involucrará el análisis de los principios de estos componentes. Si Baidu puede encontrar un montón de ellos, no reinventaré la rueda. Le enseñaré directamente cómo usar los productos secos.

Antes de usar estos componentes, entendamos primero MVVM:

1. MVVM

MVVM es Modelo (datos) Vista (vista) ViewModel (administrador de vista de datos)

Realización concreta:

Modelo: bean (clase de entidad), relacionado con la solicitud de red, relacionado con la base de datos
Vista: diseño, Vista, Actividad, Fragmento, etc.
Modelo de vista relacionado con la interfaz de usuario: similar al Presentador en MVP, utilizado para obtener información del Modelo y pasarla a la vista para mostrar ViewModel y Views están unidos e interactúan con los datos a través de ciertos medios (como LiveData)

Ejemplo, LiveData+ViewModel

LiveDataes una clase de titular de datos observable. Es consciente del ciclo de vida, lo que significa que responde al ciclo de vida de otros componentes de la aplicación, como actividades, fragmentos o servicios. Esto 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.

Antes de usar LiveData, primero puede comprender el ciclo de vida del documento oficial o consultar mi blog: "Componentes de la arquitectura de Android - Ciclo de vida"

ViewModel: un componente intermedio para la interacción de datos entre la capa de Modelo y la capa de Vista. El componente de arquitecturaViewModelproporciona una clase auxiliar para el controlador de IU, que es responsable de preparar los datos para la IU. ViewModelLos objetos se conservan automáticamente durante los cambios de configuración para que los datos que contienen estén disponibles de inmediato para la siguiente instancia de Actividad o Fragmento.

View y ViewModel pasan mensajes y datos a través de LiveData. LiveData es un contenedor de datos observable, que permite que los componentes de la aplicación observen si los datos en LiveData han cambiado. LiveData también seguirá el estado del ciclo de vida de los componentes de la aplicación (Actividad, Fragmento, Servicio) para evitar fugas de memoria, de modo que su APLICACIÓN no consuma demasiada memoria (LiveData tiene conciencia del ciclo de vida. Esto significa que, a menos que la Actividad/fragmento esté en estado de Activación (onStart pero aún no onStop), de lo contrario, la devolución de llamada no se iniciará. Cuando el fragmento llame a onStop, LiveData eliminará automáticamente al observador)

LiveData generalmente se usa junto con ViewModel de la siguiente manera:

1. Presentar

//lifecycle
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
//ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-rc02"

Versión que no es de Androidx: (Tenga en cuenta que la versión compilada es superior a 28 y la biblioteca de soporte importada también debe ser superior a 28.0.0)

// Lifecycle
implementation "android.arch.lifecycle:extensions:1.1.0"
//ViewModel
implementation "android.arch.lifecycle:viewmodel:1.1.0"
//LiveData
implementation "android.arch.lifecycle:livedata:1.1.0"

LiveData es una clase abstracta, y sus subclases de implementación incluyen MutableLiveData, MediatorLiveData y MutableLiveData se usa comúnmente.

Utilizar de la siguiente manera:

Simplemente herede ViewModel (escritura de kotlin, traduzca usted mismo si usa zapatos para niños java)

/**
 * 基础的ViewModel,可以封装一些通用操作
 *
 */
abstract class BaseViewModel : ViewModel(){
}

Datos en tiempo real:

class HomeViewModel : BaseViewModel() {
    //定义一个MutableLiveData,设置Value即可
    val data = MutableLiveData<String>()

    fun setData(name: String) {
           //这里可以去获取网络数据,操作数据库等
          //主线程可以使用setValue() ,异步线程使用postValue()
          data.value = name
    }
}

Escuche los cambios de datos en Fragment:

class HomeFragment : BaseFragment() {

    ...省略部分代码    

    private var homeViewModel: HomeViewModel? = null

    companion object {
        fun newInstance(): HomeFragment {
            return HomeFragment()
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        //获取ViewModel实例(如果我的ViewModele需要带参数怎么办?看文章后面)
        homeViewModel = ViewModelProviders.of(this)[HomeViewModel::class.java]

        //改变数据
        homeViewModel?.setData("测试")

        //监听ViewModel里面的data的数据变化
//        homeViewModel?.data?.observe(this,Observer<String>{data->{
//        } })
        homeViewModel?.data?.observe(this, Observer {
            mProgressDialog?.hide()
            Log.i("test", it)
        })

    }
}

De esta manera, la integración de LiveData y ViewModel se completa. No necesitamos prestar atención al ciclo de vida. Es simple y claro. Consulte el código completo: código fuente del proyecto

posdata

Nos acabamos de enterar que obtener la instancia de ViewModel en Fragment se obtiene de la siguiente forma:

 homeViewModel = ViewModelProviders.of(this)[HomeViewModel::class.java]

Aquí ejecutará el constructor sin argumentos de HomeViewModel, entonces, ¿qué pasa con mi constructor de ViewModel con parámetros?

El método ViewModelProviders.of proporciona un método, simplemente pase un objeto ViewModelProviders.Factory, la forma específica de escribir:

//构造函数带参数tips
class MyViewModel(private val tips:String?) :BaseViewModel() {

    val timeData = MutableLiveData<String>()

    init {
        val timer = Timer()

        timer.schedule(object : TimerTask() {
            override fun run() {
                val dataStr = TimeUtil.dateToSecondStr(Date())
                //异步线程使用postValue(),主线程用setValue()/postValue()
                timeData.postValue(tips+dataStr)
            }
        },0,1000)
    }
    
    //构造函数带参数,需要构建一个Factory,这样就可以用
    //ViewModelProviders.of(this, MyViewModel.Factory(tips)).get(MyViewModel::class.java)执行带参数的构造函数
    class Factory(private val tips:String?) : ViewModelProvider.Factory{
        override fun <T : ViewModel?> create(modelClass: Class<T>): T {
            return MyViewModel(tips) as T
        }
    }
}

transferir:

myViewModel = ViewModelProviders.of(this, MyViewModel.Factory("当前时间:")).get(MyViewModel::class.java)
        

 

Supongo que te gusta

Origin blog.csdn.net/gs12software/article/details/103307967
Recomendado
Clasificación