Android使用LiveData替换ObservableField做Data Binding

Android Studio 3.1 Canary 6 开始支持使用LiveData做Data Binding。

这里简单介绍下使用LiveData替换ObservableField做Data Binding(开发语言为kotlin)。

环境准备

1、安装Android Studio 3.1 Canary 6或以上版本。

2、升级Android Gradle插件

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.0-alpha06'
    }
}

3、更新databinding编译器的版本

kapt 'com.android.databinding:compiler:3.1.0-alpha06'

app的build.gradle如下:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.example.livedatabinding"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'android.arch.lifecycle:extensions:1.0.0'

    kapt 'com.android.databinding:compiler:3.1.0-alpha06'
    kapt 'android.arch.lifecycle:compiler:1.0.0'

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

使用

原来使用ObserverableField的ViewModel

class UsersViewModel : ViewModel() {
    private val userRepository = UserRepository()
    val name = ObservableField<String>()
    val age = ObservableInt()

    init {
        userRepository.addUser{
            name.set(it.name)
            age.set(it.age)
        }
    }
}

改用LiveData

class UserViewModel : ViewModel() {
    private val userRepository = UserRepository()
    val name = MutableLiveData<String>()
    val age = MutableLiveData<Int>()

    init {
        userRepository.updateUserInfo{
            name.postValue(it.name)
            age.postValue(it.age)
        }
    }
}

注意:LiveData暴露公开两个方法用于设置值

  • postValue:允许后台线程向主进程推送数据
  • setValue:只允许在主线程调用,如果在其他线程调用会报错:This method must be called from the main thread

绑定LiveData并对Binding设置LifecycleOwer:


class UserActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding: ActivityUserBinding? = setContentView(this, R.layout.activity_user)
        val viewModel = ViewModelProviders.of(this).get(UserViewModel::class.java)
        binding?.let {
            it.viewModel = viewModel
            it.setLifecycleOwner(this)
        }
    }
}

由于Live Data会遵从其他应用组件(如activity,fragment)的生命周期,它只会在UI组件处在active状态(如activity处在started和resumed )时才会推送数据。这样避免了我们UI展示数据时,需要检查下组件是否存在。

版权声明:著作权归作者所有。

相关推荐

Html对加载失败的图片使用默认图片替换

在img标签使用onerror监听图片的加载,如果出现错误:1、设置onerror=null,这是为了避免default.png也加载失败2、把图片的src属性设置为默认图片的url,加载默认图片替换。<img src="myimg.png" onError="this.onerror=null;this.src='default.png';&quo

Android使用Fresco加载图片的用法

在Android的App开发中,延时加载图片是硬需求。有好几个开源的项目也提供了延时加载图片的功能,常用的有:Fresco,Glide和Universal Image Loader。这里主要简单介绍下Fresco。添加依赖在build.gradle添加依赖如下:dependencies {   ...    compi

C#对DataTable做LINQ查询

我们是不能直接对DataTable做LINQ查询,DataRowCollection是没有实现IEnumerable<T>。有一些方法可以间接实现对DataTable执行LINQ查询。AsEnumerable()使用DataTable的扩展AsEnumerable(),把DataTable转换为IEnumerable<DataRow>。var results&nb

使用ANDROID_ID唯一标识Android设备

使用Settings.Secure#ANDROID_ID 会返回每个用户唯一的64位hex字符串,它是在设备首次boot时生成。我们可以使用它来唯一标识Android设备。import android.provider.Settings.Secure; private String android_id = Secure.getString(ge

Python替换文件里的文本

在原来的文件直接替换文本使用fileinput在文件上直接替换:#!/usr/bin/env python3 import fileinput with fileinput.FileInput(fileToSearch, inplace=True, backup='.bak') as file:   &nb