LiveData

作者: 禄眠 | 来源:发表于2019-11-05 13:41 被阅读0次

官方介绍

LiveData是可以在给定生命周期内观察到的数据持有者类。这意味着可以将一个Observer与LifecycleOwner成对添加,并且只有在配对的LifecycleOwner处于活动状态时,才会向该观察者通知有关包装数据的修改。如果LifecycleOwner的状态为STARTED或RESUMED,则将其视为活动状态。通过observeForever(Observer)添加的观察者被视为始终处于活动状态,因此将始终收到有关修改的通知。对于那些观察者,您应该手动调用removeObserver(Observer)。

如果相应的生命周期变为DESTROYED状态,则添加了生命周期的观察者将被自动删除。这对于活动和片段可以安全地观察LiveData而不用担心泄漏的活动尤其有用:销毁它们时,它们将立即被取消订阅。

此外,LiveData具有onActive()和onInactive()方法,以便在活动观察者的数量在0到1之间变化时得到通知。这使LiveData在没有任何活动观察者的情况下可以释放大量资源。

简介

参考LiveData

LiveData是一个数据持有类,能够感知组件的生命周期(Activity、Fragment、Service),并且只有在处于活动状态(STARTED或RESUMED)时才会像观察者通知。
对于LifecycleOwner

AppCompatActivity
extends FragmentActivity
extends ComponentActivity 
extends Activity implements LifecycleOwner

使用

  1. 使用之前的例子,创建一个类继承ViewModel类,只不过将原先的数据类型换成LiveData,并且添加一个方法
public class MyViewModelLiveData extends ViewModel {

    private MutableLiveData<Integer> number;

    public MutableLiveData<Integer> getNumber() {
        if (number == null) {
            number = new MutableLiveData<>();
            number.setValue(0);
        }
        return number;
    }

    public void addNumber(int num) {
        if (number != null) {
            number.setValue(number.getValue() + num);
        }
    }
}

除了使用setValue(),还可以使用postValue(),区别前者需要在主线程使用,后者可以在子线程中使用

  1. 在Activity中创建ViewModel
    viewModelLiveData = ViewModelProviders.of(this).get(MyViewModelLiveData.class);

  2. 为LiveData指定观察者

viewModelLiveData.getNumber().observe(this, new Observer<Integer>() {
    @Override
    public void onChanged(Integer integer) {
        textView.setText(String.valueOf(integer));
    }
});

完整代码:

package com.example.livedatademo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;

import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

public class MainActivity extends AppCompatActivity {

    TextView textView;
    ImageButton dislikeBtn, likeBtn;
    MyViewModelLiveData viewModelLiveData;

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

        textView = findViewById(R.id.textView);
        dislikeBtn = findViewById(R.id.imageButton);
        likeBtn = findViewById(R.id.imageButton3);

        viewModelLiveData = ViewModelProviders.of(this).get(MyViewModelLiveData.class);
        viewModelLiveData.getNumber().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                textView.setText(String.valueOf(integer));
            }
        });

        dislikeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModelLiveData.addNumber(-1);
            }
        });

        likeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModelLiveData.addNumber(1);
            }
        });
    }
}

相关文章

网友评论

      本文标题:LiveData

      本文链接:https://www.haomeiwen.com/subject/hnksbctx.html