LiveData是一個可觀察的數據持有者類,不過它和其他的可觀察對象不同,它會與生命周期相關聯,比如Activity的生命周期,LiveData能確保僅在Activity處於活動狀態下才會更新。也就是說當觀察者處於活動狀態,才會去通知數據更新。
個人覺得這是為了避免內存泄漏,可以說是很實用了,因為要想避免內存泄漏,必須要感知到生命周期,而原本並沒有提供額外的方法,像Glide采用了一個透明的Fragment來感知Activity的生命周期,這雖然是一個可行的方法,但總感覺並不是一個最優的方法。
下面是官方說明的使用LiveData的優點
- 確保UI與數據同步
- 不會產生內存泄漏
- 不會因為Activity停止而Crash
- 不需要手動控制生命周期
下面便是LiveData在MVVM中的角色
LiveData的使用
LiveData是配合ViewModel使用的
ViewModelWithLiveData.java
package com.example.livedatatest; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; public class ViewModelWithLiveData extends ViewModel { private MutableLiveData<Integer> LikedNumber; public MutableLiveData<Integer> getLikedNumber() { if (LikedNumber == null) { LikedNumber = new MutableLiveData<>(); LikedNumber.setValue(0); } return LikedNumber; } public void addLikedNumber(int n) { LikedNumber.setValue(LikedNumber.getValue() + n); } }
MainActivity.java
package com.example.livedatatest; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProviders; import android.os.Bundle; import android.view.View; import android.widget.ImageButton; import android.widget.TextView; public class MainActivity extends AppCompatActivity { ViewModelWithLiveData viewModelWithLiveData; TextView textView; ImageButton imageButtonLike,imageButtonDisLike; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView.findViewById(R.id.textView); imageButtonLike.findViewById(R.id.imageButton); imageButtonDisLike.findViewById(R.id.imageButton2); viewModelWithLiveData = ViewModelProviders.of(this).get(ViewModelWithLiveData.class); viewModelWithLiveData.getLikedNumber().observe(this, new Observer<Integer>() { @Override public void onChanged(Integer integer) { textView.setText(String.valueOf(integer)); } }); imageButtonLike.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewModelWithLiveData.addLikedNumber(1); } }); imageButtonDisLike.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewModelWithLiveData.addLikedNumber(-1); } }); } }