作者:长安皈故里
1.viewmodel构造函数支持传入Application
自定义一个viewmodel继承Androidviewmodel
:
class Applicationviewmodel(app: Application) : Androidviewmodel(app) {
//获取Applicaction
private val mApp: Application by lazy {
getApplication()
}
}
我们就可以在通过getApplication()
方法获取Application。
2.viewmodel构造函数支持传入其他类型参数
viewmodel支持传入工厂类来创建具体的viewmodel类型,所以我们直接继承viewmodelProvider.Factory
自定义一个工厂类,并在创建viewmodel的时候传入该自定义的工厂类。
比如下面我们支持Mainviewmodel
的构造参数传入一个Int类型:
class CustomVMFactory(
private val factory: viewmodelProvider.Factory,
private val type: Int
) : viewmodelProvider.Factory {
override fun <T : viewmodel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(Mainviewmodel::class.java)) {
return Mainviewmodel(type) as T
}
return factory.create(modelClass)
}
}
可以发现,我们自定义的CustomVMFactory
工厂类还得传入一个Activity的默认工厂
,以保证当我们自定义的工厂类无法创建viewmodel时交给原本Activity默认工厂进行处理,这就相当于一个兜底作用
,本质上体现的是静态代理模式的一种实现。
使用如下:
private val mVM by viewmodels<Mainviewmodel> {
CustomVMFactory(
defaultviewModelProviderFactory,
5
)
}
3.viewmodel中LiveData使用注意点
一般我们在viewmodel中这样定义LiveData:
//私有可变
private val data: mutablelivedata<Response<String>> = mutablelivedata()
//对外暴漏不可变
val data1: LiveData<Response<String>> = data
我们对外暴漏不可变的data1
本质上是额外声明了一个成员变量和一个成员方法:
通过反编译代码来看,其实额外声明的属性根本没有必要,我们只需要getData1
方法获取不可变的LiveData即可。
所以我们可以这样改造下:
//对外暴漏不可变
val data1: LiveData<String> get() = data
反编译看下效果:
通过反编译的代码可以看到,暴露不可变的LiveData只额外声明了一个方法
,减少了一个额外属性的声明。
4.viewmodel中协程的使用
依赖implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
中为viewmodel提供了一个协程扩展属性:viewmodelScope
我们就可以直接使用viewmodelScope
属性来执行耗时操作
和线程切换
:
fun request() {
viewmodelScope.launch(dispatchers.IO) {
//执行耗时代码,比如网络请求
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。