Android Jetpack架構組件之 Lifecycles(使用篇)

1、概述

最近簡單看了下google推出的框架Jetpack,感受此框架的內容能夠對平時的開發有很大的幫助,也能夠解決不少開發中的問題,對代碼的邏輯和UI界面實現深層解耦,打造數據驅動型UI界面。java

Android Architecture組件是Android Jetpack的一部分,它們是一組庫,旨在幫助開發者設計健壯、可測試和可維護的應用程序,包含一下組件:react

本片文章簡單介紹其中一個組件Lifecycles,只是一個入門使用,後面會陸續介紹每一個組件的使用,但願對沒接觸的同窗有點幫助,共同窗習新的東西。android

2、Lifecycles的做用

  • lifecycles簡介:

Lifecycles是一個持有組件生命週期狀態(如活動或片斷)信息的類,並容許其餘對象觀察此狀態。生命週期使用兩個主要枚舉來跟蹤其關聯組件的生命週期狀態:bash

  1. Event:從框架和Lifecycle類派發的生命週期事件。 這些事件映射到活動和片斷中的回調事件。
  2. State:由Lifecycle對象跟蹤的組件的當前狀態。

  • lifecycles使用場景

Lifecycles:生命週期感知組件,從名字中就能夠知道,這個方法是處理生命週期的相關的操做。在平時的開發過程當中,咱們不免有些邏輯的執行是和UI的生命週期相結合的,須要在特定的生命週期中執行相應的方法,咱們平時作的可能就是在View中的每一個週期調用Present中獲取數據的方法,而後在調用View的回調接口更新UI,但如今使用Lifecycles可使用註解和觀察的模式自動調用Observe中定義好的方法。架構

咱們看個簡單的例子,咱們須要在每一個週期Toast週期的名字,那咱們就要在每一個週期方法中調用:框架

override fun onResume() {
     super.onResume()
     toast("onResume")
    }

override fun onPause() {
     super.onPause()
     toast("onPause")
    }

override fun onDestroy() {
     super.onDestroy()
     toast("onDestroy")
    }複製代碼

上述狀況屬於直接調用生命週期方法,當須要調用其餘類中的方法而且須要回調時,此時可能會想到使用接口實現,在相應的生命週期中調用方法,在處理完數據後使用接口回調數據:ide

  1. 生命數據處理的類MyLocationListener
class MyLocationListener {
    public MyLocationListener(Context context, Callback callback) {
        // ...
    }

    void start() {
        // connect to system location service
    }

    void stop() {
        // disconnect from system location service
    }
}複製代碼

二、調用類中的方法並設置回調post

class MyActivity : AppCompatActivity {
    var myLocationListener :MyLocationListener

    override fun onCreate(...) {
        myLocationListener = new MyLocationListener(this, location -> {
        });
    }

    @Override
    override fun  onStart() {
        super.onStart();
        Util.checkUserStatus(result -> {
            if (result) {
                myLocationListener.start();
            }
        });
    }

    @Override
    override fun  onStop() {
        super.onStop();
        myLocationListener.stop();
    }
}複製代碼

上述是咱們平時開發最經常使用的接口方法,這樣作雖然也很方便,但這種模式致使代碼的高度耦合,而且一般咱們但願實現重量更輕的代碼,這些代碼更易於維護,下面咱們來看看LifeCycles的使用。學習

3、Lifecycles的使用

  • gradle的引入(此處已Kotlin語言爲例)
// 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"複製代碼
  • 建立MyObserver
class MyObserver(var lifecycle: Lifecycle, var callback: CallBack) : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public fun connectOnCreate() {
        p("connectOnCreate")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public fun connectOnResume() {
            p("connectOnResume")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public fun disConnectOnDestroy() {
        p("disConnectOnDestroy")
    }

    fun p(string: String) {
        callback.update(string)
    }
}複製代碼
  1. 建立MyObserver 繼承 LifecycleObserver
  2. 傳入Lifecycles和Callback,Lifecycles爲綁定Activity的生命週期,CallBack用於處理數據後的回調
  3. 使用註解在每一個方法上標記相應的生命週期
  • Implementing a custom LifecycleOwner

建立Activity並實現LifecyclesOwner,重寫方法:測試

class LifeCyclerActivity : AppCompatActivity(), LifecycleOwner {
}複製代碼
  • 建立LifecycleRegistry,並返回lifecycleRegistry
lateinit var lifecycleRegistry: LifecycleRegistry
    lifecycleRegistry = LifecycleRegistry(this)
    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }複製代碼
  • 實例化建立MyObserver,綁定Lifecycles
var myObserver = MyObserver(lifecycle, object : CallBack {
            override fun update(string: String) {
                Toast.makeText(this@LifeCyclerActivity, string, Toast.LENGTH_SHORT).show()
            }
        })
lifecycle.addObserver(myObserver)複製代碼
  • 在生命週期中設置相應的標記

在OnCreate中配置onCreate的標記

lifecycleRegistry.markState(Lifecycle.State.CREATED)複製代碼

添加其餘生命週期回調

override fun onResume() {
        super.onResume()
        lifecycleRegistry.markState(Lifecycle.State.RESUMED)
    }


    override fun onDestroy() {
        super.onDestroy()
        lifecycleRegistry.markState(Lifecycle.State.DESTROYED)
    }複製代碼
  • 若是你點擊到SupportActivity中查看的話,會發現SupportActivity自己就實現了LifecycleOwner,LifecyclerActivity中的不少操做都已經在SupportActivity中完成了,那麼上述的使用能夠直接更簡化爲:

class LifeCyclerActivity : AppCompatActivity() {

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


        var myObserver = MyObserver(lifecycle, object : CallBack {
            override fun update() {
                Toast.makeText(this@LifeCyclerActivity, "Toast", Toast.LENGTH_SHORT).show()
            }
        })
        lifecycle.addObserver(myObserver)
  }
}複製代碼

4、生命週期感知組件的最佳實踐

  • 保持UI控制器(活動和片斷)儘量,不該該在活動或片斷中直接獲取數據;相反,使用VIEW模型來作這件事,並觀察LiveData 對象,以將更改反映回視圖
  • 嘗試編寫數據驅動的UI,其中UI控制器的職責是在數據更改時更新視圖,或將用戶操做通知回VIEW模型。
  • 將數據邏輯放在VIEW模型類中。VIEW模型應充當UI控制器和應用程序其他部分之間的鏈接器。
  • 使用數據綁定來維護視圖和UI控制器之間的乾淨接口。如BufferKnife
  • 避免引用VIEW模型中的視圖或活動上下文
相關文章
相關標籤/搜索