Android框架式編程之Lifecycle

 Lifecycle官方文檔地址:https://developer.android.com/topic/libraries/architecture/lifecycleandroid

1、爲何要使用Lifecycle?

Activity 和 Fragment 是有聲明週期的,開發時咱們的不少操做須要寫在聲明週期的方法中,好比,下載、文件操做等。這樣不少狀況下會致使,咱們在 Activity中 的聲明週期方法中寫愈來愈多的代碼,從而使得 Activity 或者 Fragment 愈來愈臃腫,代碼維護愈來愈困難。這時咱們使用Lifecycle就能夠很好的解決這類問題。
Lifecycle代碼簡潔,咱們能夠經過實現LifecycleObserver 接口來監聽聲明週期,而後咱們在Activity和Fragment中去註冊監聽。git

Lifecycle 的原理圖以下:github

 看完原理圖後,咱們應該對Lifecycle有一些簡單的理解和認知了,下面咱們來說述一下Lifecycle如何使用。編程

2、Lifecycle 的使用說明

2.1 幾個重要的類和接口

Lifecycle Lifecycle是一個持有組件生命週期狀態(如Activity或Fragment)的信息的類,並容許其餘對象觀察此狀態。網絡

Event :從框架和Lifecycle類派發的生命週期事件。這些事件映射到活動和片斷中的回調事件。框架

State :由Lifecycle對象跟蹤的組件的當前狀態。編程語言

LifecycleOwner (重要)Lifecycle持有者:實現該接口的類持有生命週期(Lifecycle對象),該接口的生命週期(Lifecycle對象)的改變會被其註冊的觀察者LifecycleObserver觀察到並觸發其對應的事件。ide

LifecycleObserver(重要)Lifecycle觀察者:實現該接口的類,經過註解的方式,能夠經過被LifecycleOwner類的addObserver(LifecycleObserver o)方法註冊,被註冊後,LifecycleObserver即可以觀察到LifecycleOwner的生命週期事件。測試

2.2 LifeCycleOwner 和 LifecycleObserver 

(1). LifecycleOwner(生命週期持有者接口)

簡單來講,LifecycleOwner 就是一個接口,誰繼承了它,就持有了lifecycle對象。而後就能夠調用getLifecycle()方法獲取繼承了抽象類Lifecycle的LifecycleRegistry,而後調用 addObserver(@NonNull LifecycleObserver observer) 方法來註冊監聽。
這樣,該接口的生命週期 (Lifecycle對象) 的改變會被其註冊的觀察者LifecycleObserver觀察到並觸發其對應的事件。ui

注意:Support Library 26.1.0 及其之後的版本,Activity 和Fragment 已經實現了LifecycleOwner 接口。咱們能夠直接在Activity 和Fragment中使用getLifecycle()方法來獲取 Lifecycle 對象,來添加觀察者監聽。

(2). LifecycleObserver(生命週期觀察者接口)

LifecycleObserver 是一個觀察者接口,實現了它,能夠經過註解或者繼承的方式,來管理聲明週期的監聽。只要在持有lifecycle的類中註冊了它,當聲明週期發生變化時,它就能收到,進行咱們自定義的操做。

3、Lifecycle 實戰

目前Activity能夠不用實現 LifecycleOwner,從API14開始 AppCompatActivity已經在內部實現了 LifecycleOwner,咱們只須要使用AppCompatActivity結合Lifecycle一塊兒使用便可。

頁面代碼:

public class MainActivity extends AppCompatActivity {

    MyObserver myObserver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myObserver = new MyObserver();
        getLifecycle().addObserver(myObserver);
    }

    public void toSecond(View view) {
        startActivity(new Intent(this, SecondActivity.class));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getLifecycle().removeObserver(myObserver);
    }
}

組件監聽代碼:

package com.renhui.lifecycle;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;

public class MyObserver implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void ON_CREATE() {
        System.out.println("MyObserver:ON_CREATE");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void ON_START() {
        System.out.println("MyObserver:ON_START");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void ON_RESUME() {
        System.out.println("MyObserver:ON_RESUME");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void ON_PAUSE() {
        System.out.println("MyObserver:ON_PAUSE");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void ON_STOP() {
        System.out.println("MyObserver:ON_STOP");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void ON_DESTROY() {
        System.out.println("MyObserver:ON_DESTROY");
    }
}

Demo地址:https://github.com/renhui/LiftCycle-master

4、進階用法 

咱們能夠在初始化MyObserver的時候將lifecycle傳入,在MyObserver中進行操做時再次確認宿主的」生命週期」狀態。

if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
  //do something
}

另外,官網提供了生命週期感知組件的最佳實戰的建議:

  1. 儘量保持您的UI控制器(活動和片斷)儘量精簡。他們不該該試圖獲取他們本身的數據;相反,使用ViewModel來作到這一點,並觀察一個LiveData對象來反映更改回視圖。
  2. 嘗試編寫數據驅動的用戶界面,其中您的用戶界面控制器的職責是在數據更改時更新視圖,或將用戶操做通知給ViewModel。
  3. 把你的數據邏輯放在ViewModel類中。ViewModel應做爲您的UI控制器和其餘應用程序之間的鏈接器。但要當心,ViewModel不負責提取數據(例如,來自網絡)。相反,ViewModel應調用相應的組件來獲取數據,而後將結果提供給UI控制器。
  4. 使用dataBinding在視圖和UI控制器之間保持乾淨的界面。這使您可使您的視圖更具說明性,並最大限度地減小須要在活動和片斷中編寫的更新代碼。

若是你喜歡用Java編程語言來作到這一點,可使用像Butter Knife這樣的庫來避免樣板代碼而且有更好的抽象。

  1. 若是您的UI很複雜,請考慮建立一個演示者類(presenter)來處理UI修改。這多是一項艱鉅的任務,但它可使您的UI組件更易於測試。
  2. 避免在ViewModel中引用View或Activity上下文。

若是ViewModel超出活動(在配置更改的狀況下),則活動會泄漏而且垃圾收集器沒法正確處理。

相關文章
相關標籤/搜索