您当前的位置: 首页 > 
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Jetpack ViewModel的创建

沙漠一只雕得儿得儿 发布时间:2021-01-01 22:29:49 ,浏览量:0

viewModel属于lifecycle组件库的一部分

viewModel的特点:

1、生命周期自动感知,onClear回调函数处理资源回收closeWithRuntimeException,ViewModel绝对不能引用View、Lifecycle或任何可能包含对Activity上下文的引用的类

2、用于fragment之间的数据共享

3、viewmodel+livedata+room 数据感知,绘制UI

一、引入依赖:
    implementation 'androidx.lifecycle:lifecycle-viewmodel:2.3.0-alpha05'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-alpha05'
二、继承viewmodel/或androidViewModel
//不带application参数
class VmOne : ViewModel() {

//带application参数
class VmTwo(application: Application) : AndroidViewModel(application) {

 

三、在Activity/Fragment中创建viewModel实例

方式一、二:两种方式所带参数不一样,其实内部实现是一致的

    val vm by ViewModelLazy(VmOne::class,
        { viewModelStore },
        { defaultViewModelProviderFactory })

    val vm1: VmOne by viewModels { defaultViewModelProviderFactory }

方式三:

        val vm2 = ViewModelProvider(
            viewModelStore,
            defaultViewModelProviderFactory
        ).get(VmOne::class.java)
完整创建代码:

创建viewModel:

/**
 *  ViewModel的创建和使用
 */
class VmOne : ViewModel() {

    init {
        Log.i("VmOne", "VmOne创建")
    }

    internal fun getNum(): String {
        return "¥ vmOne ¥ ${System.currentTimeMillis()}"
    }

    override fun onCleared() {
        super.onCleared()
        Log.e("VmOne", "VmOne 销毁 onClear")
    }
}


class VmTwo(application: Application) : AndroidViewModel(application) {

    init {
        Log.i("VmTwo", "VmTwo 创建")
    }

    internal fun getNum(): String {
        return "¥ VmTwo ¥ ${System.currentTimeMillis()}"
    }

    override fun onCleared() {
        super.onCleared()
        Log.e("VmTwo", "VmTwo 销毁 onClear")
    }
}

activity中创建实例、及使用:

class MainActivity : AppCompatActivity() {

    val vm by ViewModelLazy(VmOne::class,
        { viewModelStore },
        { defaultViewModelProviderFactory })

    val vm1: VmOne by viewModels { defaultViewModelProviderFactory }

    //android view model
    val vmodel2 by viewModels { VmFactory(application) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val vm2 = ViewModelProvider(
            viewModelStore,
            defaultViewModelProviderFactory
        ).get(VmOne::class.java)

//        ViewModelProvider.NewInstanceFactory()
//        ViewModelProvider.AndroidViewModelFactory(application)
//        ViewModelProvider.Factory

        //输出结果
        Log.i("MainActivity", "vm.getNum ${vm.getNum()}")
        Log.i("MainActivity", "vm1.getNum ${vm1.getNum()}")
        Log.i("MainActivity", "vm2.getNum ${vm2.getNum()}")
        Log.i("MainActivity", "vmodel2.getNum ${vmodel2.getNum()}")

        button.setOnClickListener {
            startActivity(Intent(this, MainActivity::class.java))
        }
    }


}

项目完整代码

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.1449s