LiveDataとViewModelの完璧な組み合わせで、魅力を感じましょう

7103 ワード

LiveDataとViewModelの魅力を感じてみましょう!私のブログ

一、ガイド


LiveDataとViewModel Googleのお父さんは長い間発売されていました!簡単に言えば、LiveDataもViewModelもActivityやFragmentのライフサイクルを感知しています.言い換えれば、activityやfragmentがアクティブ(STARTEDやRESUMED)になったときに、自分の仕事をすることができます.activityやfragmentが破棄されたときは、仕事をしません.こうなった以上、メモリ漏洩は発生しません!メモリの漏洩は存在しません.それだけでプロジェクトで使用する必要があります.次に,LiveDataとViewModelについてそれぞれ述べる.

二、LiveData


2.1 LiveDataとは?

 /**
 * LiveData is a data holder class that can be observed within a given lifecycle.
 * This means that an {@link Observer} can be added in a pair with a {@link LifecycleOwner}, and
 * this observer will be notified about modifications of the wrapped data only if the paired
 * LifecycleOwner is in active state. LifecycleOwner is considered as active, if its state is
 * {@link Lifecycle.State#STARTED} or {@link Lifecycle.State#RESUMED}. An observer added via
 * {@link #observeForever(Observer)} is considered as always active and thus will be always notified
 * about modifications. For those observers, you should manually call
 * {@link #removeObserver(Observer)}.
 *
 * 

An observer added with a Lifecycle will be automatically removed if the corresponding * Lifecycle moves to {@link Lifecycle.State#DESTROYED} state. This is especially useful for * activities and fragments where they can safely observe LiveData and not worry about leaks: * they will be instantly unsubscribed when they are destroyed. * *

* In addition, LiveData has {@link LiveData#onActive()} and {@link LiveData#onInactive()} methods * to get notified when number of active {@link Observer}s change between 0 and 1. * This allows LiveData to release any heavy resources when it does not have any Observers that * are actively observing. *

* This class is designed to hold individual data fields of {@link ViewModel}, * but can also be used for sharing data between different modules in your application * in a decoupled fashion. * * @param The type of data held by this instance * @see ViewModel */


 LiveDataは、STARTEDまたはRESUMED状態でのみアクティブ化され、DESTROYED状態では自動的にremoveObserver()となり、通常のObserverとは異なり、ライフサイクルを感知する能力があることがわかる.1つの場合、自動的にremoveObserver():observeForever()メソッドを呼び出す場合は、removeObserver()メソッドを手動で呼び出す必要があります.

2.2 LiveDataのメリット


 以下は公式に列挙された長所で、私がプロジェクトでLiveDataを使用して感じた長所を白話で話します.1、メモリが漏れていないので、勝手にコードを書くことができます.2、縦横のスクリーンの时、私はどのようにデータの状态を保存するかを気にしなくて、LiveDataは私の毎回のデータがすべて最新のデータであることを保证することができます;3、MVVMの中で、View層はデータの観察をするだけで、UIを展示すればいい.ViewとModelはデカップリングし、データとビューの分離を実現する.

1⃣️Ensures your UI matches your data state


 LiveData follows the observer pattern. LiveData notifies Observer objects when the lifecycle state changes. You can consolidate your code to update the UI in these Observer objects. Instead of updating the UI every time the app data changes, your observer can update the UI every time there's a change.

2⃣️No memory leaks


 Observers are bound to Lifecycle objects and clean up after themselves when their associated lifecycle is destroyed.

3⃣️No crashes due to stopped activities


 If the observer's lifecycle is inactive, such as in the case of an activity in the back stack, then it doesn’t receive any LiveData events.

4⃣️No more manual lifecycle handling


 UI components just observe relevant data and don’t stop or resume observation. LiveData automatically manages all of this since it’s aware of the relevant lifecycle status changes while observing.

5⃣️Always up to date data


 If a lifecycle becomes inactive, it receives the latest data upon becoming active again. For example, an activity that was in the background receives the latest data right after it returns to the foreground.

6⃣️Proper configuration changes


 If an activity or fragment is recreated due to a configuration change, like device rotation, it immediately receives the latest available data.

7⃣️Sharing resources


 You can extend a LiveData object using the singleton pattern to wrap system services so that they can be shared in your app. The LiveData object connects to the system service once, and then any observer that needs the resource can just watch the LiveData object. For more information, see Extend LiveData.

2.3 LiveDataの実戦


 ソースコードを見た後、GoogleがViewModelとLiveDataを組み合わせて使用することをお勧めしていることに気づきます.あまり話さないで、コードを見ましょう.
class HomeViewModel : BaseViewModel() {

    private var mHomeMsgData: MutableLiveData? = null

    val observeHomeMsgData: MutableLiveData
        get() {
            if (mHomeMsgData == null) {
                mHomeMsgData = MutableLiveData()
            }
            return mHomeMsgData!!
        }

    //  
    fun postHomeMessageCount() {
        //  
        //  T  。
        val t = T()
        mHomeMsgData!!.postValue(t)
    }

}

class HomeActivity : BaseActivity() {

    onCreate(){
        // ...
        mViewModel.postHomeMessageCount()
    }

     mViewModel.observeHomeMsgData.observe(this, Observer {
            when (it!!.code) {
                //  UI 
                //  
            }
        })

}

 以上のコードはLiveDataとViewModelの基本的な使用です.

2.4注意事項


 MutableLiveDataはLiveDataのサブクラスであり,postValue(T value),setValue(T value)の2つのメソッドのみを書き換えた.postValueメソッドは非UIスレッドで呼び出され、setValueメソッドはUIスレッドで呼び出されます.

三、ViewModel


3.1 ViewModel到底是什么?


 View Modelを「View-Model」に分割して、賢いあなたはどういう意味か知っているでしょう.ViewとModelの橋は、MVPのPresenterに似ているのではないでしょうか.もちろん、ViewModelはactivityのコンテキストやViewのオブジェクトを持ってはいけません.そうしないと結合します!!!

3.2 ViewModelの最適化


 上のコードの中で、ViewModelは将来多くのデータ関連のコードを載せます.ViewModelは橋渡しだけをしている以上、Model層で処理したものをすべてViewModel層の中に置くべきではありません.だから、データ関連のコードを別の場所に捨てます.私のプロジェクトではRepository層(実はMedel層)を追加します.この層はローカルデータやネットワークデータに関する操作をします.
class FollowManagerViewModel : BaseViewModel() {
    private var mLoadMoreData: MutableLiveData? = null

    val followRepository: FollowRepository
        get() {
            return FollowRepository(mLoadMoreData!!)
        }

     val observeLoadMore: MutableLiveData
        get() {
            if (mLoadMoreData == null) {
                mLoadMoreData = MutableLiveData()
            }
            return mLoadMoreData!!
        }
}
class FollowRepository>(private val mMutableLiveData: MutableLiveData) {

    fun loadMore() {
        //  
        //  postValue post 
        mMutableLiveData.postValue(t)
    }

}
class HomeActivity : BaseActivity() {

    onCreate(){
        // ...
        mViewModel!!.followRepository.loadMore()
    }

     mViewModel.observeLoadMore.observe(this, Observer {
            when (it!!.code) {
                //  UI 
                //  
            }
        })

}

The End