android MutableLiveData与AndroidViewModel避坑小提示,Java
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;
import android.app.Application;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private String TAG = "fly";
private MyData myData = new MyData();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyModel myModel = new MyModel(this.getApplication());
myData.observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.d(TAG, "onChanged - " + s);
}
});
myModel.start();
}
private class MyData extends MutableLiveData<String> {
@Override
public void setValue(String value) {
super.setValue(value);
Log.d(TAG, "setValue - " + value);
}
@Override
public void postValue(String value) {
super.postValue(value);
Log.d(TAG, "postValue - " + value);
}
@Override
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super String> observer) {
super.observe(owner, observer);
Log.d(TAG, "observe");
}
@Override
protected void onActive() {
super.onActive();
Log.d(TAG, "onActive");
}
@Override
protected void onInactive() {
super.onInactive();
Log.d(TAG, "onInactive");
}
}
public class MyModel extends AndroidViewModel {
public MyModel(@NonNull Application application) {
super(application);
}
public void start() {
for (int i = 0; i < 3; i++) {
myData.postValue("a " + i);
SystemClock.sleep(100);
}
SystemClock.sleep(1000);
for (int i = 5; i < 8; i++) {
myData.setValue("b " + i);
SystemClock.sleep(100);
}
}
}
}
输出:
(1)setValue()必须在UI主线程调用。而postValue()则可以在后台线程(非UI线程)调用。
(2)setValue()在postValue()之后。
(3)在LiveData设置(UI线程)数据任务之前,如果postValue()了多次数据,但只有最后一个数据会被分发主线程设置。可以简单的理解为,postValue()最终的数据呈现是setValue()实现。
(4)当potsValue()之后,getValue()不一定会取到在postValue()的数据,只有当主线程setValue()之后,才能取到postValue()的值。也就是说,除非主线程setValue()了postValue()的值,否则取不到。