Android LiveData的使用

  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的值已经刷新到页面上

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值