jetpack学习

224 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

参考学习:

ViewModel

ViewModel的一个重要作用就是可以帮助Activity分担一部分工作,它是专门用于存放与界面相关的数据的。界面上能看得到的数据,相关变量都应该存放在ViewModel中。这样可以减少Activity的逻辑.

ViewModel还有一个重要的特性:手机发生横竖屏旋转的时候,Activity就会重建,存在于Activity中的数据也会消失,但ViewModel的生命周期Activity不同,它可以保证手机屏幕发生旋转的时候不会被重新创建。只有当Activity退出的时候才会跟着Activity一起销毁。

//使用这个组件,需要添加依赖:
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'


//通常来讲,编程规范是给每一个activity和fragment创建一个对应的ViewModel。
//为MainActivity创建一个对应的MainViewModel类,并继承自ViewModel。	
class MainViewModel() : ViewModel() {
    var counter=0//用于计数。
}


//每次点击按钮更新数据。
//一定要通过ViewModelProviders来获取ViewModel实例。
private lateinit var viewModel: MainViewModel
private lateinit var tv: Button
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    ////viewmodel
    viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
    tv = findViewById(R.id.text1)
    tv.setOnClickListener {
        viewModel.counter++
        refresh()
    }
    refresh()
}
private fun refresh() {
    tv.text = viewModel.counter.toString()
}

向ViewModel传递参数。(借助ViewModelProvider.Factory)

class MainViewModel(countReserved: Int) : ViewModel() {
    var counter = countReserved
}

//创建MainViewModelFactory,并实现ViewModelProvider.Factory接口
class MainViewModelFactory(private val contReserved: Int) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return MainViewModel(contReserved) as T
    }
}


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

    ...
    //666即为我们向viewModel传入的数据
    viewModel = ViewModelProviders.of(this, MainViewModelFactory(666)).get(MainViewModel::class.java)
    ...
}

LifeCycles

用来感知Activity生命周期的情况(比如页面里进行网络请求的时候,页面或许已经关闭了,此时就不应该对相应的结果进行处理。)

它可以让任何一个类都能轻松感知到Activity的生命周期。(LifecycleObserver是一个空方法接口,只需要进行一下接口声明就可以了。)

应用:实用小技巧:利用Lifecycle写出更好维护的代码

//1、新建MyObserver类,实现LifecycleObserver接口。(7种注解分别对应相应的生命周期)
//2、在activity(继承自AppCompatActivity)或fragment(继承自androidx.fragment.app)里
class MyObserver :LifecycleObserver{
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun actStart() {
        Log.d("MyObserver","actStart")
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun actStop() {
        Log.d("MyObserver","actStop")
    }
}

//在oncreate里:lifecycle.addObserver(MyObserver())
//可以通过 lifecycle.currentState 来获取当前的生命周期。

LiveData

一种响应式变成组件,它可以包含任何类型的数据,并在数据发生变化的时候通知给观察者。

LiveData特别适合与ViewModel结合一起使用。

为什么使用liveData?

一些组件依赖activity的onResume、onPause,需要开发者手动激活、解绑操作等。这些手工维持的,开发者容易疏忽。而且分散的代码不容易维护。如果新增了状态监听,那么所有的activity都要重写。

class MainViewModel(countReserved: Int) : ViewModel() {
    val counter = MutableLiveData<Int>()

    init {
        counter.value = countReserved
    }

    fun plus() {
        val count = counter.value ?: 0
        counter.value = count + 1
    }

    fun clear() {
        counter.value = 0
    }
}


//oncreat:
public void onCreate() {
    super.onCreate();
    tv.setOnClickListener {
        viewModel.plus()
    }
    viewModel.counter.observe(this, Observer { count ->
        tv.text = count.toString()
    })
}
//kotlin为observe()方法添加了扩展。我们需要添加依赖
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'

//然后就可以这样了
viewModel.counter.observe(this){
	tv.text = count.toString()
}