LiveData是一个可观察的数据持有者类,但和其他的可观察对象不同,它与生命周期相关联,比如Activity的生命周期。LiveData能确保仅在Activity处于活动状态下才会更新。也就是说当观察者处于活动状态,才会去通知数据更新。
个人认为这是避免内存泄漏一个很实用的操作。
官方说明LiveData的优点
- 确保UI与数据同步
- 不会产生内存泄漏
- 不会因为Activity停止而Crash
- 不需要手动控制生命周期
1 package com.example.livedatatest; 2 3 import androidx.lifecycle.MutableLiveData; 4 import androidx.lifecycle.ViewModel; 5 6 public class ViewModelWithLiveData extends ViewModel { 7 private static MutableLiveData<Integer> LikedNumber; 8 9 /* ViewModelWithLiveData(){ //避免数据为空 10 LikedNumber =new MutableLiveData<>(); 11 LikedNumber.setValue(0); 12 }*/ 13 14 15 public MutableLiveData<Integer> getLikedNumber() { 16 if(LikedNumber == null){ //避免数据为空 17 LikedNumber =new MutableLiveData<>(); 18 LikedNumber.setValue(0); 19 } 20 return LikedNumber; 21 } 22 23 24 static public void addLinkedNumber(int n){ //+n 或者 -n 25 LikedNumber.setValue(LikedNumber.getValue()+n); 26 } 27 }
实现代码
1 package com.example.livedatatest; 2 3 import androidx.appcompat.app.AppCompatActivity; 4 import androidx.lifecycle.Observer; 5 import androidx.lifecycle.ViewModelProvider; 6 import androidx.lifecycle.ViewModelProviders; 7 8 import android.os.Bundle; 9 import android.view.View; 10 import android.widget.ImageButton; 11 import android.widget.TextView; 12 13 public class MainActivity extends AppCompatActivity { 14 ViewModelWithLiveData viewModelWithLiveData; 15 TextView textView; 16 ImageButton button1,button2; 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 textView = findViewById(R.id.textView); 23 button1 = findViewById(R.id.imageButton); 24 button2 = findViewById(R.id.imageButton2); 25 26 viewModelWithLiveData = ViewModelProviders.of(this).get(ViewModelWithLiveData.class); 27 //为变量添加一个观察 观察自我 若发生变化 则呼叫下面函数 函数执行 28 viewModelWithLiveData.getLikedNumber().observe(this, new Observer<Integer>() { 29 @Override 30 public void onChanged(Integer integer) { 31 textView.setText(String.valueOf(integer)); 32 } 33 }); 34 35 button1.setOnClickListener(new View.OnClickListener() { 36 @Override 37 public void onClick(View v) { 38 ViewModelWithLiveData.addLinkedNumber(1); 39 } 40 }); 41 42 button2.setOnClickListener(new View.OnClickListener() { 43 @Override 44 public void onClick(View v) { 45 ViewModelWithLiveData.addLinkedNumber(-1); 46 } 47 }); 48 } 49 }