LiveDatade的基本使用

特征:
1.首先LiveData 其实与数据实体类是一样的东西,它负责暂存数据
2.其次LiveData 其实也是一个观察者模式的数据实体类,它可以跟它注册的观察者回调数据是否已经更新
3.LiveData 还能知晓它绑定的Activity或者Fragment的声明周期,它只会给前台活动的activity回调,这样可以放心的在它的回调方法里直接将数据添加到View,而不用担心会不会报错

LiveData 与MutableLiveData区别:
1.MutableLiveData的父类是LiveData
2.LiveData在实体类里可以通知指定某个字段的数据更新
3.MutableLiveData则是完全是整个实体类或者数据类型变化后才通知,不会细节到某个字段
LiveData不可变,MutableLiveData是可变的

DemoData.java

public class DemoData extends LiveData<DemoData> {
    private int x;
    private int y;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
        postValue(this);
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
        postValue(this);
    }
}

继承LiveData并且在泛型里写下你的实体类,注意的是:postValue(this),这个方法是用于回调数据更新的方法(在需要被观察的数据里添加)

创建ViewModel
需要在ViewModle实例化DemoData这个类(ViewModle是用于管理多个Activity或者Fragment数据的类)

public class DemoViewModel extends ViewModel {
    private DemoData data = new DemoData();

    public DemoData getData(){
        return data;
    }
}

在Activity或者Fragment中绑定

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private DemoViewModel mDemoViewModel;
    private Button mBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtn = findViewById(R.id.btn);
        //获取ViewModel,让ViewModel与此activity绑定
        mDemoViewModel = new ViewModelProvider(this,new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(DemoViewModel.class);
        //注册观察者,观察数据的变化
        mDemoViewModel.getData().observe(this, new Observer<DemoData>() {
            @Override
            public void onChanged(DemoData demoData) {
                Log.d(TAG, "onChanged: " + demoData.getX());
            }
        });

        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mDemoViewModel.getData().setX(10);
            }
        });
    }
}

MutableLiveData

public class MutableLiveData<T> extends LiveData<T> {
    @Override
    public void postValue(T value) {
        super.postValue(value);
    }

    @Override
    public void setValue(T value) {
        super.setValue(value);
    }
}

注意:
postValue
1.此方法可以在其他线程中使用
2.如果在主线程执行发布的任务之前多次调用此方法,则仅将分配最后一个值
3.如果同时调用setValue(a)和postValue(b),一定是值b被a覆盖
setValue:此方法只能在主线里调用

因为MutableLiveData只是作用变量所以我们直接就可以在ViewModel里面实例化它,并且在泛型里标注变量的类型

public class DemoViewModelMutable extends ViewModel {
    private MutableLiveData<String>  mString = new MutableLiveData<>();

    public MutableLiveData<String> getString(){
        return mString;
    }

    public void setString(String s){
        mString.setValue(s);
    }
}

绑定

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private DemoViewModelMutable mDemoViewModel;
    private Button mBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtn = findViewById(R.id.btn);
        //获取ViewModel,让ViewModel与此activity绑定
        mDemoViewModel = new ViewModelProvider(this,new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(DemoViewModelMutable.class);
        //注册观察者,观察数据的变化
        mDemoViewModel.getString().observe(this, new Observer<String>() {
            @Override
            public void onChanged(String s) {
                Log.d(TAG, "onChanged: " + s);
            }
        });

        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mDemoViewModel.setString("hahahaha");
            }
        });
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值