简介
- 当系统发生重新启动的时候,ViewModel也会被回收,所以使用ViewModelState也无法保留此时的数据,所以需要使用SharedPreferences来对数据进行保存,由于SharedPreferences需要使用application context,所以我们可以使用AndroidViewModel(持有Application Context)
使用示例
class MyAndroidViewModel(application: Application, savedStateHandle: SavedStateHandle) : AndroidViewModel(application) {
private val savedStateHandle: SavedStateHandle
var key = getApplication<Application>().resources.getString(R.string.data_key)
var name = getApplication<Application>().resources.getString(R.string.shp_name)
init {
this.savedStateHandle = savedStateHandle
// 如果初始化不存在该key的值,就重新加载,存在则直接可以读取
if (!savedStateHandle.contains(key)) {
load()
}
}
fun load() {
// 如果保存成了SharedPreferenced则取出数据
val sharedPreferences = getApplication<Application>().getSharedPreferences(name, Context.MODE_PRIVATE)
// 存在数据则获取,否则为0,并将数据设置进saveSatehandle中
savedStateHandle.set(key, sharedPreferences.getInt(key, 0))
}
fun getNumber(): LiveData<Int> {
// 从saveStatehandle中读取数据
return savedStateHandle.getLiveData(key)
}
fun save() {
// 将数据保存至sharedPreferences中
val sharedPreferences = getApplication<Application>().getSharedPreferences(name, Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
editor.putInt(key, getNumber().value!!)
editor.apply()
}
fun add(x: Int) {
// 将数据保存至savedStateHandle中
savedStateHandle.set(key, getNumber().value!! + x)
}
}
- Activity中进行AndroidViewModel的绑定与数据的保存
class MainActivity : AppCompatActivity() {
private lateinit var mViewModel: MyAndroidViewModel
private lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 将视图绑定
activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// vm和控制器绑定
mViewModel = ViewModelProviders.of(this).get(MyAndroidViewModel::class.java)
// 取回数据, this LifeCycleOwner
activityMainBinding.setWjx(mViewModel)
// 进行数据观察
activityMainBinding.setLifecycleOwner(this)
}
override fun onPause() {
super.onPause()
mViewModel.save()
}
}