官方介绍
LiveData是可以在给定生命周期内观察到的数据持有者类。这意味着可以将一个Observer与LifecycleOwner成对添加,并且只有在配对的LifecycleOwner处于活动状态时,才会向该观察者通知有关包装数据的修改。如果LifecycleOwner的状态为STARTED或RESUMED,则将其视为活动状态。通过observeForever(Observer)添加的观察者被视为始终处于活动状态,因此将始终收到有关修改的通知。对于那些观察者,您应该手动调用removeObserver(Observer)。
如果相应的生命周期变为DESTROYED状态,则添加了生命周期的观察者将被自动删除。这对于活动和片段可以安全地观察LiveData而不用担心泄漏的活动尤其有用:销毁它们时,它们将立即被取消订阅。
此外,LiveData具有onActive()和onInactive()方法,以便在活动观察者的数量在0到1之间变化时得到通知。这使LiveData在没有任何活动观察者的情况下可以释放大量资源。
简介
LiveData是一个数据持有类,能够感知组件的生命周期(Activity、Fragment、Service),并且只有在处于活动状态(STARTED或RESUMED)时才会像观察者通知。
对于LifecycleOwner
:
AppCompatActivity
extends FragmentActivity
extends ComponentActivity
extends Activity implements LifecycleOwner
使用
- 使用之前的例子,创建一个类继承
ViewModel
类,只不过将原先的数据类型换成LiveData,并且添加一个方法
public class MyViewModelLiveData extends ViewModel {
private MutableLiveData<Integer> number;
public MutableLiveData<Integer> getNumber() {
if (number == null) {
number = new MutableLiveData<>();
number.setValue(0);
}
return number;
}
public void addNumber(int num) {
if (number != null) {
number.setValue(number.getValue() + num);
}
}
}
除了使用setValue()
,还可以使用postValue()
,区别前者需要在主线程使用,后者可以在子线程中使用
-
在Activity中创建ViewModel
viewModelLiveData = ViewModelProviders.of(this).get(MyViewModelLiveData.class);
-
为LiveData指定观察者
viewModelLiveData.getNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
textView.setText(String.valueOf(integer));
}
});
完整代码:
package com.example.livedatademo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
public class MainActivity extends AppCompatActivity {
TextView textView;
ImageButton dislikeBtn, likeBtn;
MyViewModelLiveData viewModelLiveData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
dislikeBtn = findViewById(R.id.imageButton);
likeBtn = findViewById(R.id.imageButton3);
viewModelLiveData = ViewModelProviders.of(this).get(MyViewModelLiveData.class);
viewModelLiveData.getNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
textView.setText(String.valueOf(integer));
}
});
dislikeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModelLiveData.addNumber(-1);
}
});
likeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModelLiveData.addNumber(1);
}
});
}
}
网友评论