美文网首页
[学习]JetPack中的LiveData(一)

[学习]JetPack中的LiveData(一)

作者: 吴敬悦 | 来源:发表于2021-02-11 22:31 被阅读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 。这样代码就更加简洁。

    相关文章

      网友评论

          本文标题:[学习]JetPack中的LiveData(一)

          本文链接:https://www.haomeiwen.com/subject/ueylxltx.html