完整 LiveData Demo(Java 实现)
下面是一个可直接运行的完整 LiveData 示例,包含 ViewModel、LiveData 的基本使用以及与 UI 的交互。
- 项目结构
app/
├── java/
│ ├── com.example.livedatademo/
│ │ ├── MainActivity.java
│ │ ├── UserViewModel.java
│ │ └── User.java
├── res/
│ ├── layout/
│ │ └── activity_main.xml - 实现代码
activity_main.xml
xml
<TextView
android:id="@+id/tvUserInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户信息将显示在这里"
android:textSize="18sp" />
<EditText
android:id="@+id/etUserName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:hint="输入用户名" />
<EditText
android:id="@+id/etUserAge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:hint="输入年龄"
android:inputType="number" />
<Button
android:id="@+id/btnUpdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="更新用户信息" />
<Button
android:id="@+id/btnRandom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="随机生成用户" />
User.java (数据模型) java public class User { private String name; private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "姓名: " + name + ", 年龄: " + age;
}
}
UserViewModel.java
java
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import java.util.Random;
public class UserViewModel extends ViewModel {
// 私有可变的LiveData
private final MutableLiveData mUser = new MutableLiveData<>();
// 对外暴露不可变的LiveData
public LiveData<User> getUser() {
return mUser;
}
// 更新用户信息
public void updateUser(String name, int age) {
User user = new User(name, age);
mUser.setValue(user);
}
// 生成随机用户
public void generateRandomUser() {
String[] names = {"张三", "李四", "王五", "赵六", "钱七"};
int randomAge = new Random().nextInt(50) + 10;
String randomName = names[new Random().nextInt(names.length)];
updateUser(randomName, randomAge);
}
}
MainActivity.java
java
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private UserViewModel viewModel;
private TextView tvUserInfo;
private EditText etUserName, etUserAge;
private Button btnUpdate, btnRandom;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化视图
tvUserInfo = findViewById(R.id.tvUserInfo);
etUserName = findViewById(R.id.etUserName);
etUserAge = findViewById(R.id.etUserAge);
btnUpdate = findViewById(R.id.btnUpdate);
btnRandom = findViewById(R.id.btnRandom);
// 初始化ViewModel
viewModel = new ViewModelProvider(this).get(UserViewModel.class);
// 观察LiveData
viewModel.getUser().observe(this, new Observer<User>() {
@Override
public void onChanged(User user) {
// 当用户数据变化时更新UI
tvUserInfo.setText(user.toString());
}
});
// 更新按钮点击事件
btnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = etUserName.getText().toString();
String ageStr = etUserAge.getText().toString();
if (!name.isEmpty() && !ageStr.isEmpty()) {
int age = Integer.parseInt(ageStr);
viewModel.updateUser(name, age);
}
}
});
// 随机生成按钮点击事件
btnRandom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.generateRandomUser();
}
});
}
}
3. 运行说明
将上述代码复制到你的 Android Studio 项目中
确保已添加必要的依赖(见前面的依赖部分)
运行应用后,你可以:
输入用户名和年龄,点击"更新用户信息"按钮
点击"随机生成用户"按钮自动创建随机用户
观察 TextView 会自动更新显示最新用户信息
- 功能扩展建议
添加数据验证
在 UserViewModel.java 中添加:
java
public boolean isValidUser(String name, String ageStr) {
if (name == null || name.trim().isEmpty()) {
return false;
}
try {
int age = Integer.parseInt(ageStr);
return age > 0 && age < 150;
} catch (NumberFormatException e) {
return false;
}
}
添加错误处理 LiveData
在 UserViewModel.java 中:
java
private final MutableLiveData mError = new MutableLiveData<>();
public LiveData getError() {
return mError;
}
// 在updateUser方法中添加验证
public void updateUser(String name, String ageStr) {
if (!isValidUser(name, ageStr)) {
mError.setValue(“无效的用户信息”);
return;
}
int age = Integer.parseInt(ageStr);
User user = new User(name, age);
mUser.setValue(user);
mError.setValue(null);
}
在 MainActivity.java 中观察错误:
java
viewModel.getError().observe(this, new Observer() {
@Override
public void onChanged(String error) {
if (error != null) {
Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();
}
}
});
这个完整 Demo 展示了 LiveData 的核心用法,包括:
创建和观察 LiveData
在 ViewModel 中管理数据
UI 和数据分离
响应式更新界面
你可以基于这个 Demo 进一步扩展,添加更多功能如网络请求、数据库操作等。