[学习]JetPack中的LiveData(一)
2021-02-11 本文已影响0人
吴敬悦
这个东西不是很好理解,我编写简单的例子来帮助我理解,跟着官方操作进行的。也试着去理解。
1. 首先添加相关的依赖
在 app/build.gradle
中添加:
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt' // 包含这个
}
...
android {
...
dataBinding {
enabled = true
}
...
}
dependencies {
...
implementation 'androidx.activity:activity-ktx:1.1.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
}
2. 小demo
就是实现一个文本框,能够自动跳动,只要是模拟网络请求的情况。
效果如下:
demo效果
3. 效果xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewmodel"
type="com.example.livedatatest.LiveDataViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{Integer.toString(viewmodel.number)}"
android:textColor="#2196F3"
android:textSize="36sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.252" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
4. model和LiveData
import androidx.lifecycle.*
import kotlinx.coroutines.delay
import java.util.*
class LiveDataViewModel: ViewModel() {
val number: LiveData<Int> = liveData {
while (true) {
val rand = Random()
delay(1000)
emit(rand.nextInt(100))
}
}
}
object LiveDataVMFactory: ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return LiveDataViewModel() as T
}
}
这里很简单,就是每隔一秒钟,随机产生一个整数。其中 delay
是延时, emit
就会更新 number
的值。下面的 LiveDataVMFactory
实例化一个 ViewModel
对象。
5. MainActivity.java 代码
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.databinding.DataBindingUtil
import com.example.livedatatest.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private val liveDataViewModel: LiveDataViewModel by viewModels {LiveDataVMFactory}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
binding.lifecycleOwner = this
binding.viewmodel = liveDataViewModel
}
}
这里使用了委托的方式 by
。这样代码就更加简洁。