JetPack -- AndroidViewModel

简介

  • 当系统发生重新启动的时候,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()
    }
}

发布了175 篇原创文章 · 获赞 56 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_39424143/article/details/105097605