Lifecycle LiveData與ViewModel
Lifecycle使用
它是Google官方釋出的一個處理Activity和Fragment宣告週期的框架,之前我們處理生命週期都是在類裡面做處理。如下這種方式本身是沒有任何問題的,但是如果類或者邏輯一多,這種處理宣告週期的邏輯就會很多了。
@Override protected void onStart() { super.onStart(); //處理onStart p層.xx } @Override protected void onResume() { super.onResume(); //處理onResume p層.xx } @Override protected void onDestroy() { super.onDestroy(); }
有沒有什麼辦法讓Presenter或者一些其他需要感知act或者fgt自動感知,這樣就可以解耦這種在生命週期呼叫方法的情況了。
通過Lifecycle解決這個問題
AppCompatActivity中提供了一個getLifecycle方法,通過addObserver() 就加入一個生命週期觀察物件,如果當前activity變更了生命週期,ClickListener中的監聽方法也會被呼叫。
ClickListener類實現了LifecycleObserver介面,表示這個類需要感知生命週期,通過@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)註解來註解對應的生命週期方法
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ClickListener clickListener = new ClickListener(getLifecycle()); getLifecycle().addObserver(clickListener); } @Override protected void onStart() { super.onStart(); } }
public class ClickListener implements LifecycleObserver { Lifecycle mLif; public ClickListener(Lifecycle lifecycle) { mLif = lifecycle; } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) void onResume() { Log.i("jinwei", "onResume=" + mLif.getCurrentState()); } @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) void onCreate() { Log.i("jinwei", "onCreate"); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) void onStop() { Log.i("jinwei", "onStop"); } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) void onDestroy() { Log.i("jinwei", "onDestroy"); if (mLif.getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { Log.i("jinwei", "***************"); } } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) void onPause() { Log.i("jinwei", "onPause"); } @OnLifecycleEvent(Lifecycle.Event.ON_START) void onStart() { Log.i("jinwei", "onStart"); } }
我們也可以通過實現LifecycleOwner介面實現一個自己的Lifecycle。重點是我們建立了一個LifecycleRegistry類,
public class MainActivity extends AppCompatActivity implements LifecycleOwner { LifecycleRegistry registry; @Override public Lifecycle getLifecycle() { return registry; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); registry = new LifecycleRegistry(this); ClickListener clickListener = new ClickListener(getLifecycle()); getLifecycle().addObserver(clickListener); setContentView(R.layout.activity_main); }
Lifecycle解決的問題
降低程式碼耦合,可以觀察act和fgt的生命週期,實現自動監聽,不需要手動在act和fgt中去呼叫,簡化了程式碼增加了可維護的程度。
LiveData和ViewModel
我們開發中經常會有一個這樣的問題,我們的一些請求網路的邏輯程式碼,或者操作資料層的程式碼都會寫在activity層中。有可能經常有一個Activity類幾千行程式碼。
ViewModel
ViewModel就是解決這個問題的,它的唯一作用和概念就是它只做資料層面的操作,比如網路請求,比如資料庫操作。這些操作都可以放在ViewModel中,當我們專案的程式碼一大的時候就可以看到它的好處了。當然光是這樣還不能滿足我的期望,這個時候LiveData就上場了。
LiveData
LiveData是一個抽象的資料類,它的主要作用是提供通知給View層做資料重新整理。通過LiveData包裝的資料類,只要資料集一變更,監聽通知的地方就會自動收到資料重新整理的回撥。
class NameViewModel : ViewModel() { var name: MutableLiveData<String>? = MutableLiveData() /** * 宿主銷燬後呼叫的,可以做一些清除資料的操作。 */ override fun onCleared() { super.onCleared() name = null; Log.i("jinwei", "onCleared"); } //可以做網路請求 fun loadData() { name?.value = "我是測試資料" } }
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NameViewModel model = ViewModelProviders.of(this).get(NameViewModel.class); model.getName().observe(this, new Observer<String>() { @Override public void onChanged(@Nullable String s) { Log.i("jinwei","onChangeds =" +s); Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG); TextView text = findViewById(R.id.text); text.setText(s); } }); model.loadData(); } }
LiveData的observe方法就是監聽一個數據更新通知。
宣告週期
ViewModel的宣告週期依賴於Activiy或者Fragment,會在onCreate的時候建立ViewModel,ViewModel的生命週期一直持續到Activity最終銷燬或Frament最終detached,期間由於螢幕旋轉等配置變化引起的Activity銷燬重建並不會導致ViewModel重建

image
初始化通過如下方式
NameViewModel model = ViewModelProviders.of(this).get(NameViewModel.class);
this引數一般為Activity或Fragment,因此ViewModelProvider可以獲取元件的生命週期。
Activity在生命週期中可能會觸發多次onCreate(),而ViewModel則只會在第一次onCreate()時建立,然後直到最後Activity銷燬。