使用反射机制搭建MVVM架构
Java的反射机制是指在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制
一、搭建BaseViewModel类
继承自ViewModel
open class BaseViewModel:ViewModel() {
open fun clear(){
}
override fun onCleared() {
super.onCleared()
clear()
}
}
二、搭建BaseActivity类
继承自AppCompatActivity
abstract class BaseActivity<VB:ViewBinding,VM:BaseViewModel>:AppCompatActivity() {
protected var viewBinding: VB? = null
protected var mViewModel: VM? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
try {
viewBinding = getViewBindingInstance(layoutInflater)
mViewModel = getViewModelInstance()
setContentView(viewBinding?.root)
initData()
initObserver()
initOnListener()
}catch (e:Exception){
LogUtils.e("${javaClass.simpleName} onCreate: ${e.message}")
}
}
private fun getViewModelInstance():VM{
val superClass = javaClass.genericSuperclass as ParameterizedType
val vmClass = (superClass.actualTypeArguments[1] as Class<VM>).kotlin
return ViewModelProvider(this)[vmClass.java]
}
private fun getViewBindingInstance(inflater: LayoutInflater):VB{
val superClass = javaClass.genericSuperclass as ParameterizedType
val vbClass = superClass.actualTypeArguments[0] as Class<VB>
val method = vbClass.getMethod("inflate", LayoutInflater::class.java)
return method.invoke(null,inflater) as VB
}
override fun onDestroy() {
super.onDestroy()
destroy()
}
protected abstract fun initData()
protected abstract fun initOnListener()
protected abstract fun initObserver()
open fun destroy(){}
}
三、继承BaseViewModel实现MainViewModel类
class MainViewModel:BaseViewModel() {
}
四、继承BaseActivity实现MainActivity类
class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
override fun initData() {
}
override fun initOnListener() {
}
override fun initObserver() {
}
}