温馨提示:本文最后更新于
2025-11-24 17:49:08,某些文章具有时效性,若有错误或已失效,请在下方留言。基本介绍
LiveData 是一个可观察的数据持有类。与普通的可观察对象不同,LiveData 具备生命周期感知能力,也就是说它会遵循应用中其他组件(如 Activity、Fragment 或 Service)的生命周期。
这种生命周期感知能够确保 LiveData 只会通知处于活跃生命周期状态的观察者进行更新。
如果生命周期状态是 STARTED 或 RESUMED,LiveData 会将观察者视为“活跃状态”。只有活跃的观察者才会收到 LiveData 的更新通知。
代码示例
1. 开启 DataBinding
plugins {
alias(libs.plugins.android.application)
}
android {
namespace = "com.stewednoodles.viewmodelapp"
compileSdk {
version = release(36)
}
defaultConfig {
applicationId = "com.stewednoodles.viewmodelapp"
minSdk = 24
targetSdk = 36
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
buildFeatures {
dataBinding = true
}
}
dependencies {
implementation(libs.appcompat)
implementation(libs.material)
implementation(libs.activity)
implementation(libs.constraintlayout)
testImplementation(libs.junit)
androidTestImplementation(libs.ext.junit)
androidTestImplementation(libs.espresso.core)
}
2. 页面布局
页面布局的样式,如下所示
<?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.stewednoodles.viewmodelapp.MyViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/main"
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="View Model App"
android:textSize="32sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.149" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="88dp"
android:text="0"
android:textSize="48sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<Button
android:onClick="@{viewModel::incrementCounter}"
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="132dp"
android:text="Increase Counter"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
3. 创建 ViewModel
ViewModel 的代码,如下所示
package com.stewednoodles.viewmodelapp;
import android.view.View;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends ViewModel {
private MutableLiveData<Integer> counter = new MutableLiveData<>();
public LiveData<Integer> getCounter() {
return counter;
}
public void incrementCounter(View view) {
int currentValue = counter.getValue() != null ? counter.getValue() : 0;
counter.setValue(currentValue + 1);
}
}
3. MainActivity
MainActivity 的代码,如下所示
package com.stewednoodles.viewmodelapp;
import android.os.Bundle;
import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import com.stewednoodles.viewmodelapp.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
int counter = 0;
ActivityMainBinding mainBinding;
MyViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mainBinding.setViewModel(viewModel);
// 观察 LiveData 数据
viewModel.getCounter().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
mainBinding.textView2.setText(String.valueOf(integer));
}
});
}
}
4. 运行效果
运行效果,如下所示
© 版权声明
THE END













暂无评论内容