Android MutableLiveData

https://blog.csdn.net/feather_wch/article/details/88648559

我们在《ViewModel的基本使用》这篇文章中提到了,ViewModel的主要作用是存放页面所需要的各种数据,而当这些数据发生变化时,我们采用接口的方式实现对页面的通知。这样做是可行的,但如果要观察的数据很多,则需要定义大量的接口,代码显得冗余。为此,Android为我们提供了LiveData组件,帮助我们完成ViewModel与页面组件之间的通信。所以,LiveData通常是被放在ViewModel中使用

LiveData是一个可被观察的数据容器类。什么意思呢?我们可以将LiveData理解为一个数据的容器,它将数据包装起来,使得数据成为“被观察者”,页面成为“观察者”。这样,当该数据发生变化时,页面能够获得通知,进而更新UI。

进一步区别一下ViewModel和LiveData。ViewModel用于存放页面所需的各种数据,它还包括一些业务逻辑等,比如我们可以在ViewModel对数据进行加工,获取等操作。而对页面来说,它并不关心这些业务逻辑,它只关心需要展示的数据是什么,并且希望在数据发生变化时,能及时得到通知并做出更新。LiveData的作用就是,在ViewModel中的数据发生变化时通知页面。从LiveData(实时数据)这个名字,我们也能推测出,它的特性与作用。

我们来看看,如何在ViewModel中使用LiveData对数据进行包装。LiveData是一个抽象类,不能直接使用,所以通常我们使用它的直接子类MutableLiveData

public class TimerWithLiveDataViewModel extends ViewModel
{
    //将“秒钟”这个字段用MutableLiveData包装起来
    private MutableLiveData<Integer> currentSecond;

    public LiveData<Integer> getCurrentSecond()
    {
        if (currentSecond == null)
        {
            currentSecond = new MutableLiveData<>();
        }
        return currentSecond;
    }
}

LiveData定义之后,如何利用它实现页面与ViewModel之间的通信呢?

public class TimerWithLiveDataActivity extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timer_with_live_data);
        iniComponent();
    }

    private void iniComponent()
    {
        //通过ViewModelProviders得到ViewModel
        TimerWithLiveDataViewModel timerWithLiveDataViewModel = ViewModelProviders.of(this).get(TimerWithLiveDataViewModel.class);

        //得到ViewModel中的LiveData
        final MutableLiveData<Integer> liveData = (MutableLiveData<Integer>)timerWithLiveDataViewModel.getCurrentSecond();

        //通过LiveData.observe()实现对ViewModel中数据变化的观察
        liveData.observe(this, new Observer<Integer>()
        {
            @Override
            public void onChanged(@Nullable Integer second)
            {
                //收到回调后更新UI界面
                ((TextView)findViewById(R.id.tvTime)).setText("TIME:" + second);
            }
        });

        findViewById(R.id.btnResetTime).setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //通过LiveData.setValue()/LiveData.postValue()完成对ViewModel中数据的更新
                liveData.setValue(0);
            }
        });

        timerWithLiveDataViewModel.startTiming();
    }
}

在页面中,我们通过LiveData.observe()方法对LiveData包装的数据进行观察,反过来,当我们想要修改LiveData包装的数据时,可通过LiveData.postValue()/LiveData.setValue()来完成。postValue()是在非UI线程中使用,如果在UI线程中,则使用setValue()方法。

页面与LiveData之间的通信

让我们深入LiveData.observe()方法的源码。

@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
    if (owner.getLifecycle().getCurrentState() == DESTROYED) {
        // ignore
        return;
    }
    LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
    ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
    if (existing != null && !existing.isAttachedTo(owner)) {
        throw new IllegalArgumentException("Cannot add the same observer"
                + " with different lifecycles");
    }
    if (existing != null) {
        return;
    }
    owner.getLifecycle().addObserver(wrapper);
}

可以看到它接收的第一个参数是一个LifecycleOwner对象,在我们的示例中即Activity对象。第二个参数是一个Observer对象。通过最后一行代码将Observer与Activity的生命周期关联在一起。

    owner.getLifecycle().addObserver(wrapper);

所以,LiveData能够感知页面的生命周期。它可以检测页面当前的状态是否为激活状态,或者页面是否被销毁。只有在页面处于激活状态(Lifecycle.State.ON_STARTED或Lifecycle.State.ON_RESUME)时,页面才会收到来自LiveData的通知,如果页面被销毁(Lifecycle.State.ON_DESTROY),那么LiveData会自动清除与页面的关联,从而避免了可能引发的内存泄漏问题。

LiveData还提供了一个observeForever()方法,使用起来与observe()没有太大差别,它们的区别主要在于,当LiveData包装的数据发生变化时,无论页面处于什么状态,observeForever()都能收到通知。所以,在使用完之后,一定要记得调用removeObserver()方法来停止对LiveData的观察,否则LiveData会一直处于激活状态,你的Activity永远不会被系统自动回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MutableLiveData EditText是Android中的两个类。MutableLiveData是一个可变的LiveData对象,用于在ViewModel和UI之间传递数据。EditText是一个用户可以输入文本的UI组件。 在应用程序中,我们可以使用MutableLiveData EditText来实现数据的双向绑定。当用户在EditText中输入文本时,MutableLiveData对象将自动更新其值。反之,当MutableLiveData对象的值发生变化时,EditText中的文本也会自动更新。 这种双向绑定的方式可以使我们的应用程序更加灵活和高效。它可以帮助我们更好地管理数据,并且可以减少代码的复杂性。 ### 回答2: LiveData是一个数据持有类,用于观察数据变化。MutableLiveDataLiveData的子类,它允许在数据发生变化时修改LiveData的值,而LiveData的值只能在初始化时设置,并通过getter方法公开访问数据值,但它是不可变的。 EditText是一个Android界面组件,用于在用户界面上允许用户输入或编辑文本。如果我们使用LiveData将EditText中的文本绑定到ViewModel或Repository等组件中,则可以实时观察文本的变化。但是,在更改EditText内容时,我们需要使用MutableLiveData来跟新LiveData的值。 举个例子,假设我们需要在EditText中输入用户姓名,我们可以创建一个MutableLiveData实例,并将其绑定到EditText。现在,每当EditText内容发生变化时,我们可以调用MutablcLiveData的setValue方法来更新LiveData的值,这将在ViewModel或Repository中触发数据更新。然后,使用LiveData的观察者模式来实时响应数据变化,比如在TextView中显示用户姓名等其他界面上展示用户信息的地方。 总之,MutableLiveDataLiveData的一种变种,它允许在LiveData的值变化时修改其值。在EditText中输入或编辑文本时,我们可以使用MutableLiveData实现实时更新LiveData的值,以传递或响应数据变化。这种方法将帮助我们实现响应式编程范例,提高应用程序的响应速度和用户体验。 ### 回答3: MutableLiveData最常见的用法是用于数据通信和交互,而EditText是Android原生控件之一,用户可以通过它来输入数据。将二者结合使用,可以实现监听用户输入的功能。具体使用步骤如下: 1. 首先,在xml布局文件中添加EditText控件。 2. 在Activity或Fragment中定义MutableLiveData对象,方便将EditText中的文本数据进行通信和交互。 3. 在onCreate()方法中添加对EditText控件的监听器,监听EditText中输入的文本内容。 4. 监听到用户输入的文本内容后,将文本内容存储到MutableLiveData中,以便其他组件可以使用这些数据进行下一步操作。 例如: 在xml布局文件中添加一个EditText控件: <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入文本" /> 在Activity中定义MutableLiveData对象: private MutableLiveData<String> mutableLiveData = new MutableLiveData<>(); 在onCreate()方法中添加EditText监听器: final EditText editText = findViewById(R.id.editText); editText.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) { mutableLiveData.setValue(charSequence.toString()); } @Override public void afterTextChanged(Editable editable) { } }); 可以看到,当用户在EditText中输入文本时,会触发TextWatcher接口中的onTextChanged()方法,将文本内容存储到MutableLiveData中。如果其他组件需要获得EditText中输入的文本内容,只需要观察MutableLiveData对象即可。 总之,使用MutableLiveData与EditText联合实现输入监听功能,可以在Android应用开发中方便地实现数据通信和交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值