一手遮天 Android - jetpack: ViewModel 基础以及 viewModelScope
一手遮天 Android - jetpack: ViewModel 基础以及 viewModelScope
示例如下:
/jetpack/lifecycle/ViewModelDemo.kt
/**
* ViewModel
* 注重结合生命周期管理数据,发生 configuration change(比如横竖屏切换等)时不会销毁数据(关于 configuration change 请参见 /ui/ConfigurationChangeDemo1.java)
* 当不需要 ViewModel 时,比如 activity 将要销毁时,此时绑定到此 activity 的 ViewModel 会自动调用自己的 onCleared() 方法,然后销毁自己
*/
package com.webabcd.androiddemo.jetpack.lifecycle
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import kotlinx.android.synthetic.main.activity_jetpack_lifecycle_viewmodeldemo.*
import com.webabcd.androiddemo.R
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class ViewModelDemo : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_jetpack_lifecycle_viewmodeldemo)
// 引用 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" 后
// 就可以使用下面这种简单的方式创建创建一个指定的 ViewModel 对象,并绑定到指定的 activity
// 否则的话需要自己写 ViewModelProvider.Factory,那样会比较麻烦
val viewModel = ViewModelProvider(this)[CustomViewModel::class.java]
textView1.text = viewModel.name
button1.setOnClickListener {
finish()
}
}
override fun onDestroy() {
super.onDestroy()
Log.d("lifecycle", "Activity onDestroy()")
}
}
// 自定义 ViewModel
class CustomViewModel: ViewModel() {
var name = "webabcd"
fun test() {
/**
* 引用 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0" 后
* ViewModel 会有一个扩展属性 viewModelScope,其可以将协程绑定到 ViewModel 生命周期,即 ViewModel 销毁时,协程也会自动被取消
*/
viewModelScope.launch {
withContext(Dispatchers.IO) {
}
}
viewModelScope.launch(Dispatchers.IO){
}
}
// 当不需要 ViewModel 时,比如 activity 将要销毁时,此时绑定到此 activity 的 ViewModel 会自动调用自己的 onCleared() 方法,然后销毁自己
// 如果需要的话,你可以在这里清理相关资源
override fun onCleared() {
super.onCleared()
Log.d("lifecycle", "ViewModel onCleared()")
}
}
/layout/activity_jetpack_lifecycle_viewmodeldemo.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="关闭 activity"/>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>