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();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MyModel myModel = new MyModel(this.getApplication());myData.observe(this, new Observer<String>() {@Overridepublic void onChanged(String s) {Log.d(TAG, "onChanged - " + s);}});myModel.start();}private class MyData extends MutableLiveData<String> {@Overridepublic void setValue(String value) {super.setValue(value);Log.d(TAG, "setValue - " + value);}@Overridepublic void postValue(String value) {super.postValue(value);Log.d(TAG, "postValue - " + value);}@Overridepublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super String> observer) {super.observe(owner, observer);Log.d(TAG, "observe");}@Overrideprotected void onActive() {super.onActive();Log.d(TAG, "onActive");}@Overrideprotected 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