Android Jetpack -- ViewModel & LiveData


これらのブログを見たとき、Android Jetpackに関する知識がたくさんあると思います.Jetpackの原理について、いくつかの文章はよく話しています.ここでは繰り返しません.このシリーズのブログは、簡単なデモを通じて、みんなと一緒に最も基本的な使い方を熟知することを目的としています.
Android Jetpack -- Lifecycle
Android Jetpack -- ViewModel & LiveData
Android Jetpack -- paging & room
Android Jetpack -- navigation
プロジェクトgitアドレス:https://github.com/zhangtiansimple/jetpack_demo
------------------------------------------------------------------------------------------------------------------------
LiveDataとViewModelの関係は非常に緊密であるため、LIveDataも通常ViewModelに宣言されているため、この2つのコンポーネントを1つのブログで共有します.
まずは小さな栗を見てみましょう
class MyViewModel() : ViewModel() {

    private var title: MutableLiveData? = null

    public fun getTitle(): MutableLiveData {
        if (title == null) {
            title = MediatorLiveData()
            loadTitle()
        }
        return title as MutableLiveData
    }

    private fun loadTitle() {
        title!!.setValue("load title success")
    }
}

MutableLiveDataはLiveDataから継承される
public class MutableLiveData extends LiveData {
    @Override
    public void postValue(T value) {
        super.postValue(value);
    }

    @Override
    public void setValue(T value) {
        super.setValue(value);
    }
}

LiveDataのインスタンスインタフェースをViewModelで露出し、必要なビューで呼び出します.
class ViewModelActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_viewmodel)

        viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
        viewModel.getTitle().observe(this, Observer {
            tv_viewmodel.setText(it)
        })
    }
}

ActivityでviewModelのインスタンスを取得した後、LiveDataの中の観察方法をそのまま使用し、データが変化したときにUIの更新を直接行うのは、とても便利なのではないでしょうか.
次にLiveDataのobserver()メソッドを見てみましょう
 @MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer super T> observer) {
        assertMainThread("observe");
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
            // ignore
            return;
        }
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        if (existing != null && !existing.isAttachedTo(owner)) {
            throw new IllegalArgumentException("Cannot add the same observer"
                    + " with different lifecycles");
        }
        if (existing != null) {
            return;
        }
        owner.getLifecycle().addObserver(wrapper);
    }

この方法では主に3つのことをした.
1.LifeCycleの状態がDESTROYEDの場合は、新しいデータを受信することなくそのまま戻ります.
2.LifeCycleBoundObserverオブジェクトがLifeCycleOwnerとObserverの連絡を確立したことを宣言します.
3.LifeCycleBoundObserverの例を観察する
ではLifeCycleBoundObserverは何に使うのでしょうか
class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
        @NonNull
        final LifecycleOwner mOwner;

        LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer super T> observer) {
            super(observer);
            mOwner = owner;
        }

        @Override
        boolean shouldBeActive() {
            return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
        }

        @Override
        public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
            if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
                removeObserver(mObserver);
                return;
            }
            activeStateChanged(shouldBeActive());
        }

        @Override
        boolean isAttachedTo(LifecycleOwner owner) {
            return mOwner == owner;
        }

        @Override
        void detachObserver() {
            mOwner.getLifecycle().removeObserver(this);
        }
    }

この方法の主な役割は,観察者を除去し,ライフサイクルが変化したときにonStateChangedをコールバックすることである.
LiveDataとViewModelの簡単な使用はここまで紹介されています.シリーズの文章はすべて科学的で、深く実践するには仲間たちが実践の中で絶えず総括して勉強する必要があります.