LiveData
是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
下面这个较为简单的示例将展示如何使用LiveData。
创建ViewModel
LiveData一般跟ViewModel结合一起用,关于ViewModel的介绍可以看我的另外一篇文章Android ViewModel的使用。
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class DataViewModel extends ViewModel {
private MutableLiveData<String> name;
private MutableLiveData<Integer> age;
public MutableLiveData<String> getName() {
if (name == null) {
name = new MutableLiveData<String>();
//获取初始值的操作,否则默认为""。
name.setValue("JohnLiu");//看需求,可以换成进行网络请求来下载数据
}
return name;
}
public MutableLiveData<Integer> getAge() {
if (age == null) {
age = new MutableLiveData<Integer>();
//获取初始值的操作,否则默认为0。
age.setValue(24);
}
return age;
}
}
在Activity中对LiveData进行观察。
创建观察数据的Activity,里面用到的ViewModelUtils这个类的代码可在Android ViewModel的使用这篇文章里查看(如果用该类的getPrivateViewModel()方法的话就实现不了效果,原因可以看两种方法的区别说明。)
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.jetpackdemo.R;
public class LiveDataActivity extends AppCompatActivity {
private DataViewModel dataViewModel;
private TextView tv_name,tv_age;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_data);
tv_name = findViewById(R.id.tv_name);
tv_age =findViewById(R.id.tv_age);
dataViewModel = ViewModelUtils.getViewModel(this, DataViewModel.class);
// dataViewModel = ViewModelUtils.getPrivateViewModel(this, DataViewModel.class,this);
//观察name值的变化
dataViewModel.getName().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.d("JohnLiu","nameChange");
tv_name.setText(s);
}
});
//观察age值的变化
dataViewModel.getAge().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
Log.d("JohnLiu","ageChange");
tv_age.setText(String.valueOf(integer));
}
});
findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(LiveDataActivity.this, UpdateValueActivity.class);
startActivity(intent);
}
});
}
}
及其布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".livedata.LiveDataActivity"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt"
android:text="赋值"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="name当前值为:"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="age当前值为:"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_age"/>
</LinearLayout>
修改LiveData的数据
这里只是为了方便演示在别的Activity修改LiveData的值的效果。关键的设值就只有dataViewModel.getAge().setValue(Integer.valueOf(charSequence.toString()));
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import com.jetpackdemo.R;
public class UpdateValueActivity extends AppCompatActivity {
private DataViewModel dataViewModel;
private EditText et_name,et_age;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update_value);
dataViewModel =ViewModelUtils.getViewModel(this, DataViewModel.class);
// dataViewModel = ViewModelUtils.getPrivateViewModel(this, DataViewModel.class,this);
et_name = findViewById(R.id.et_name);
et_name.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
dataViewModel.getName().setValue(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
}
});
et_age = findViewById(R.id.et_age);
et_age.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
dataViewModel.getAge().setValue(Integer.valueOf(charSequence.toString()));
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
}
效果图
刚进入到这个模块,name和age为初始值。
点击赋值,跳转到另外一个页面修改他们的值。
然后返回上一个页面,Observer收到值变化的通知,onChanged方法触发。可以看到name和age的值已经刷新到页面上