[学习]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 。这样代码就更加简洁。

上一篇下一篇

猜你喜欢

热点阅读