AAC---LifeCycle

LifeCycle介紹

LifeCycle最主要解決的問題是在Activity或者Fragment的生命週期中功能與頁面狀態之間的關係,以及對於功能太多時,onResume以及onPause等生命週期函數太臃腫產生的。

LifeCycle的使用

  1. 根據需要添加LifeCycle的配置項
dependencies {
    def lifecycle_version = "1.1.1"

    // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
    // alternatively - just ViewModel
    implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // use -ktx for Kotlin
    // alternatively - just LiveData
    implementation "android.arch.lifecycle:livedata:$lifecycle_version"
    // alternatively - Lifecycles only (no ViewModel or LiveData).
    //     Support library depends on this lightweight import
    implementation "android.arch.lifecycle:runtime:$lifecycle_version"

    annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
    // alternately - if using Java8, use the following instead of compiler
    implementation "android.arch.lifecycle:common-java8:$lifecycle_version"

    // optional - ReactiveStreams support for LiveData
    implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"

    // optional - Test helpers for LiveData
    testImplementation "android.arch.core:core-testing:$lifecycle_version"
}
  1. 實現LifecycleObserver 接口,定義該功能能力,並且通過OnLifecycleEvent標註該能力對應的生命週期
public class LifeCycleListener implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void startLocation() {
      // Do Something
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void stopLocation() {
      // Do Something
    }
}
  1. 在Activity/Fragment中註冊Observer
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DataBindingUtil.setContentView(this, R.layout.activity_main);
        getLifecycle().addObserver(new LifeCycleListener());
    }

}

PS:

  • lifecycle.getCurrentState().isAtLeast(STARTED)可以用來判斷當前頁面的狀態

DIV實現LifeCycle

在26.1.0之後Support Lib中的Activity以及Fragments都已經實現了LifeCycleOwner接口,如果沒有使用AppComaptActivity的話,可以自己實現一套LifeCycle。

將Activity與Fragment實現LifeCycleOwner接口,並且在內部創建LifecycleRegistry對象,在生命週期的回調函數中標記當前狀態即可。

public class MyActivity extends Activity implements LifecycleOwner {
    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLifecycleRegistry = new LifecycleRegistry(this);
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    @Override
    public void onStart() {
        super.onStart();
        mLifecycleRegistry.markState(Lifecycle.State.STARTED);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}

LifeCycle的最佳實踐

  • 儘量保持UI Controller(Activity以及Fragment)的精簡。UI Controller不應該獲取數據,而應該使用ViewModel獲取數據,並且使用LiveData來監聽數據的變化,並且把變化的數據告知View。
  • 儘量使用數據驅動UI(data-driven UI)的方式,而UI Controller的作用應該是當數據變化的時候更新View,或者將用戶Action告知ViewModel
  • 將數據邏輯放到ViewModel中。ViewModel應該充當UI Controller與APP其他部分的橋樑,它應該獲取數據,並且回調給UI Controller。
  • 使用 Data Binding保持View與UI Controller之間的整潔,它可以讓View更加清楚,並且在Activity和Fragment中的代碼更少
  • 如果UI很複雜的話,可以考慮使用MVP模式來處理UI更新
  • 禁止在ViewModel中使用Context以及Activity,因爲這樣很容易導致Activity泄露,並且不會被GC回收

參考資料

Handling lifecycles with lifecycle-aware components

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