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()的值,否则取不到。
Android LiveData简介(一)_livedata onactive_zhangphil的博客-CSDN博客Android LiveData简介(一)使用Android的LiveData,需要在gradle添加引用: compile "android.arch.lifecycle:runtime:1.0.0" compile "android.arch.lifecycle:extensions:1.0.0" annotationProcessor "android.arch.lifhttps://blog.csdn.net/zhangphil/article/details/78592235
Google I/O Android官方新体系架构之:Lifecycle_android google lifecycle_zhangphil的博客-CSDN博客Google I/O 2017 Android官方新体系架构之:LifecycleGoogle官方在2017 I/O大会中引入一些列Android新的体系架构内容,其中有一个是Android的Lifecycle。Lifecycle实现的一个重要目的,是实现Android的与Activity和Fragment生命周期相关的逻辑控制进一步的解耦。简单的理解,以前因为要写于Android activithttps://blog.csdn.net/zhangphil/article/details/77049812