LiveData与MutableLiveData详解

https://blog.csdn.net/xfb1989/article/details/106637834

 

LiveData是干什么的

1.首先LiveData其实与数据实体类(POJO类)是一样的东西,它负责暂存数据.

2.其次LiveData其实也是一个观察者模式的数据实体类,它可以跟它注册的观察者回调数据是否已经更新.

3.LiveData还能知晓它绑定的Activity或者Fragment的生命周期,它只会给前台活动的activity回调(这个很厉害).这样你可以放心的在它的回调方法里直接将数据添加到View,而不用担心会不会报错.

LiveData与MutableLiveData区别

LiveData与MutableLiveData的其实在概念上是一模一样的.唯一几个的区别如下:

1.MutableLiveData的父类是LiveData

2.LiveData在实体类里可以通知指定某个字段的数据更新.

3.MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段

LiveData简单使用Demo

创建LiveData

 
  1. package com.szyh.demo.bean;

  2.  
  3. import androidx.lifecycle.LiveData;

  4.  
  5. public class SelfDefineData extends LiveData<SelfDefineData> {

  6. private int tag1;

  7. private int tag2;

  8.  
  9. public int getTag1() {

  10. return tag1;

  11.  
  12. }

  13. public void setTag1(int tag1) {

  14. this.tag1 = tag1;

  15. postValue(this);

  16. }

  17.  
  18. public int getTag2() {

  19. return tag2;

  20. }

  21.  
  22. public void setTag2(int tag2) {

  23. this.tag2 = tag2;

  24. postValue(this);

  25. }

  26.  
  27. @Override

  28. public String toString() {

  29. return "DemoData{" +

  30. "tag1=" + tag1 +

  31. ", tag2=" + tag2 +

  32. '}';

  33. }

  34. }

 

 创建SelfDefineViewModel

 
  1. package com.szyh.demo.view;

  2.  
  3. import com.szyh.demo.bean.SelfDefineData;

  4.  
  5. import androidx.lifecycle.ViewModel;

  6.  
  7. public class SelfDefineViewModel extends ViewModel {

  8. // TODO: Implement the ViewModel

  9. private SelfDefineData mDemoData = new SelfDefineData();

  10.  
  11. public SelfDefineData getDemoData() {

  12. return mDemoData;

  13. }

  14. }

 在Activity或者Fragment绑定

 
  1. package com.szyh.demo;

  2.  
  3. import androidx.appcompat.app.AppCompatActivity;

  4. import androidx.lifecycle.Observer;

  5. import androidx.lifecycle.ViewModelProviders;

  6. import android.os.Bundle;

  7. import android.util.Log;

  8. import android.view.View;

  9. import android.widget.Button;

  10. import com.szyh.demo.bean.SelfDefineData;

  11. import com.szyh.demo.view.SelfDefineViewModel;

  12.  
  13. public class MainActivity extends AppCompatActivity {

  14.  
  15. private static final String TAG = "MainActivity";

  16. private Button mTestBtn;

  17. private SelfDefineViewModel mDemoViewModel;

  18.  
  19. @Override

  20. protected void onCreate(Bundle savedInstanceState) {

  21. super.onCreate(savedInstanceState);

  22. setContentView(R.layout.activity_main);

  23. mTestBtn = (Button) findViewById(R.id.test_btn);

  24. mDemoViewModel = ViewModelProviders.of(this).get(SelfDefineViewModel.class);//获取ViewModel,让ViewModel与此activity绑定

  25. mDemoViewModel.getDemoData().observe(this, new Observer<SelfDefineData>() { //注册观察者,观察数据的变化

  26. @Override

  27. public void onChanged(SelfDefineData demoData) {

  28. Log.d(TAG, "onChanged demoData: " + demoData.toString());

  29. }

  30. });

  31.  
  32. mTestBtn.setOnClickListener(new View.OnClickListener() {

  33. @Override

  34. public void onClick(View v) {

  35. mDemoViewModel.getDemoData().setTag1(123); //这里手动用按键点击更新数据

  36. }

  37. });

  38. }

  39. }

 

————————————————————————————————————————————————

创建MutableLiveData

 
  1. package com.szyh.demo.view;

  2.  
  3. import androidx.lifecycle.MutableLiveData;

  4. import androidx.lifecycle.ViewModel;

  5.  
  6. public class MutableViewModel extends ViewModel {

  7. // TODO: Implement the ViewModel

  8. private MutableLiveData<String> myString = new MutableLiveData<>();

  9.  
  10. public MutableLiveData<String> getMyString(){

  11. return myString;

  12. }

  13.  
  14. public void setMyString(String string) {

  15. this.myString.setValue(string);

  16. }

  17. }

在Activity或者Fragment绑定

 
  1. package com.szyh.demo;

  2.  
  3. import android.os.Bundle;

  4. import android.util.Log;

  5. import android.view.View;

  6. import android.widget.Button;

  7. import com.szyh.demo.view.MutableViewModel;

  8. import androidx.appcompat.app.AppCompatActivity;

  9. import androidx.lifecycle.Observer;

  10. import androidx.lifecycle.ViewModelProviders;

  11.  
  12. public class MainActivity2 extends AppCompatActivity {

  13.  
  14. private static final String TAG = "MainActivity2";

  15. private Button mTestBtn;

  16. private MutableViewModel mDemoViewModel;

  17.  
  18. @Override

  19. protected void onCreate(Bundle savedInstanceState) {

  20. super.onCreate(savedInstanceState);

  21. setContentView(R.layout.activity_main);

  22.  
  23. mTestBtn = (Button) findViewById(R.id.test_btn);

  24.  
  25. mDemoViewModel = ViewModelProviders.of(this).get(MutableViewModel.class);//获取ViewModel,让ViewModel与此activity绑定

  26. mDemoViewModel.getMyString().observe(this, new Observer<String>() { //注册观察者

  27. @Override

  28. public void onChanged(String s) {

  29. Log.d(TAG, "onChanged s " + s);

  30. }

  31. });

  32.  
  33. mTestBtn.setOnClickListener(new View.OnClickListener() {

  34. @Override

  35. public void onClick(View v) {

  36. mDemoViewModel.setMyString("测试"); //用手动按键点击改变值

  37. }

  38. });

  39. }

  40. }

 

API全解

postValue()

  可能你已经在上面看到几次调用此方法了。postValue的特性如下:

  1.此方法可以在其他线程中调用

  2.如果在主线程执行发布的任务之前多次调用此方法,则仅将分配最后一个值。

  3.如果同时调用 .postValue(“a”)和.setValue(“b”),一定是值b被值a覆盖。

setValue()

  setValue()的特性如下:

  1.此方法只能在主线程里调用

getValue()

  返回当前值。 注意,在后台线程上调用此方法并不能保证将接收到最新的值。

removeObserver(@NonNull final Observer<? super T> observer) 

  移除指定的观察者

 
  1. Observer<String> observer = new Observer<String>() {

  2. @Override

  3. public void onChanged(String s) {

  4. mText.setText("内容改变=" + s);

  5. }

  6. };

  7. mMainViewModel.getContent().observe(this, observer);//绑定

  8. mMainViewModel.getContent().removeObserver(observer);//解除

removeObservers(@NonNull final LifecycleOwner owner)

  移除当前Activity或者Fragment的全部观察者

mMainViewModel.getContent().removeObservers(this);

 

 hasActiveObservers()

  如果此LiveData具有活动(Activity或者Fragment在前台,当前屏幕显示)的观察者,则返回true。其实如果这个数据的观察者在最前台就返回true,否则false。

hasObservers()

  如果此LiveData具有观察者,则返回true。

 

observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer)

  设置此LiveData数据当前activity或者Fragment的观察者,会给此activity或者Fragment在前台时回调数据。

 

observeForever(@NonNull Observer<? super T> observer)

  1.设置永远观察者,永远不会被自动删除。您需要手动调用removeObserver(Observer)以停止观察此LiveData,

  2.设置后此LiveData,一直处于活动状态,不管是否在前台哪里都会获得回调。

 

举例

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值