LiveData败许,當(dāng)數(shù)據(jù)改變時(shí)可被觀察到,同時(shí)具有生命感知能力芭析,該能力是由于其內(nèi)部類LifecycleBoundObserver繼承了GenericLifecycleObserver->LifecycleEventObserver->LifecycleObserver。
關(guān)鍵代碼:
observe(LifecycleOwner owner, Observer<? super T> observer) {
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
...
owner.getLifecycle().addObserver(wrapper);
}
當(dāng)組件(如:Activity)生命周期狀態(tài)改變時(shí),會(huì)移除observer,所以也就不會(huì)發(fā)生內(nèi)存泄漏。也不用手動(dòng)處理生命周期。
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver);
return;
}
activeStateChanged(shouldBeActive());
}
使用:
LiveData通常放在ViewModel中废菱,由ViewModel管理LiveData技矮。
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class NameViewModel extends ViewModel {
MutableLiveData<String> name;
public MutableLiveData<String> getName() {
if (name == null) {
name = new MutableLiveData<>();
}
return name;
}
}
在Activity中,觀察LiveData的改變
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
public class LiveDataActivity extends AppCompatActivity {
NameViewModel nameViewModel;
private TextView tvName;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_live_data);
nameViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory())
.get(NameViewModel.class);
nameViewModel.getName().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
//改變LiveData的值后殊轴,會(huì)被觀察到衰倦,從而改變tvName的值
tvName.setText(s);
}
});
nameViewModel.getName().setValue("Android");
tvName = findViewById(R.id.tvName);
findViewById(R.id.btnChangeName).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//改變LiveData的值
nameViewModel.getName().setValue("Google");
}
});
}
}
當(dāng)LiveData值改變時(shí),TextView的內(nèi)容也隨之改變旁理。