android MutableLiveData与AndroidViewModel避坑小提示,Java

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);
            }
        }
    }
}

输出:

8d0d2ee9cb6e4b7eb16339a9e303c4a5.png

(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

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/129616889