騷年都2020年了你還在用EventBus嗎?jetpack之liveData

在說源碼時簡單說下liveData使用

//在app的build添加依賴

//使用liveData
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'

 

1創建一個類實現ViewModel,定義一個方法獲取liveData

/**
 * liveData是個抽象類 ,可以理解爲一個能感知生命週期的倉庫
 * mutableLIveData 是他的實現類
 */
public class MyViewModel extends ViewModel {
    //注意使用static修飾 源碼直接通過類獲取
    private static MutableLiveData<List<Bean>> mutableLiveData;

    //獲取倉庫
    public MutableLiveData<List<Bean>> getLiveData() {
        if (mutableLiveData == null) {
            mutableLiveData = new MutableLiveData<>();
        }
        return mutableLiveData;
    }

}

 

2定義一個bean類

public class Bean {
    String name;

    public Bean(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

3在activity中使用

訂閱消息代碼

  //調用系統API獲取 viewModel
        MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        liveData = myViewModel.getLiveData();
        //訂閱消息
        liveData.observe(this, new Observer<List<Bean>>() {
            @Override
            public void onChanged(List<Bean> beans) {
                //數據接收
                Toast.makeText(LiveDataActivity.this, "" + beans.get(0).getName(), Toast.LENGTH_SHORT).show();
            }
        });

 

發送消息代碼

 list.add(new Bean("張三"));
 list.add(new Bean("李四"));
liveData.setValue(list);

 

 

使用很簡單,那我們分析下liveData是源碼時如何實現的呢?

liveData這麼好,那麼我們看看他的源碼的核心邏輯

我們從獲取ViewModel代碼入口  ViewModelProviders.of(this).get(MyViewModel.class);

點擊of()方法,代碼很簡單,獲取activity的application,創建ViewModelProviders對象

 

點擊get()方法,把ViewModel的實現類和類全類名,傳給內部get方法

 

點擊內部的get方法,代碼很簡單,先從一個ViewModelStore獲取ViewModel,如果有就直接返回,沒有就創建,再保存到ViewmodelStore,再返回。

 

我們看看工廠的create()方法是如何創建ViewModel的,看到下圖源碼就一目瞭然,使用反射創建的

 

我們看看ViewModelStore代碼,就是個HashMap保存的ViewModel封裝類,源碼看多,有很多類似的使用map複用的類似代碼。

 

現在我們看看MutablLiveData的setValue()方法,點擊進去,沒有什麼代碼,那應該調用父類的setValue方法,

 

點擊到父類的setValue方法,調用了dispatchValue方法

 

我們看看dispatchValue做了些什麼,又調用了considerNotify()方法,在這個方法最後行代碼,他實現了接口Observer的onChanged()方法

最終還是通過接口回調方式,把數據給到訂閱者。

 

 

這是有人問,那liveData是如何感知感知什麼週期的呢?我們點擊liveData的obser方法,會發現是使用Lifecycle實現生命週期的監聽。

 

如果對Lifecycle不瞭解的可以看我這篇文章https://blog.csdn.net/qq_36237165/article/details/102544785

 

liveData源碼介紹到這,下面是我們基於liveData封裝的一個庫,可以實現一行代碼發送消息,一行代碼訂閱消息,還能感知生命週期,從數據根源上防止內存泄漏。

https://blog.csdn.net/qq_36237165/article/details/104878044

喜歡的點星Thanks♪(・ω・)ノ

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章