Android架構組件LiveData

来源:https://www.cnblogs.com/ttylinux/archive/2023/07/08/17537976.html
-Advertisement-
Play Games

有一段時間,在B站那裡刷視頻的時候,無意刷到一個德生的收音機視頻。突然讓我想起了我的中學時代,我的中學時代是在收音機的陪伴之下成長的。那個時候,主要的想法是為了收聽短波的英文電臺,美名日學習英語。不過那個時候,能清晰聽到的英文廣播電臺並不多,更多的是外國播放的中文廣播電臺,而這些電臺大多數是說國內的 ...


LiveData LiveData是基於觀察者模式創建的,其中,LiveData是被觀察者,觀察者通過註冊方法,監聽被觀察者的數據變化。LiveData在數據發生變化的時候,會通知觀察者。 LiveData是一個容器,存放數據的容器,它的數據變化可以被監聽,也就是LiveData是一個被觀察者,如下,創建了一個存放String的數據容器currentName:
public class NameViewModel extends ViewModel {


// Create a LiveData with a String
private MutableLiveData<String> currentName;


   public MutableLiveData<String> getCurrentName() {
       if (currentName == null) {
           currentName = new MutableLiveData<String>();
       }
       return currentName;
   }


// Rest of the ViewModel...
}
監聽LiveData數據變化,為LiveData添加觀察者,如下,添加一個nameObserver,監聽LiveData的數據變化,當LiveData的數據發生變化的的時候,onChanged方法會被回調,從而更新UI。
public class NameActivity extends AppCompatActivity {

   private NameViewModel model;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       // Other code to setup the activity...

       // Get the ViewModel.
       model = new ViewModelProvider(this).get(NameViewModel.class);
       // Create the observer which updates the UI.
       final Observer<String> nameObserver = new Observer<String>() {
           @Override
           public void onChanged(@Nullable final String newName) {
               // Update the UI, in this case, a TextView.
               nameTextView.setText(newName);
           }
       };
       // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
       model.getCurrentName().observe(this, nameObserver);
   }
}
更新LiveData數據的方式,使用setValue和postValue兩個方法 LiveData發佈修改有setValue和postValue兩種方式,其中setValue只能在主線程調用,postValue則沒有這個限制
button.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
       String anotherName = "John Doe";
       model.getCurrentName().setValue(anotherName);
   }
});
應用架構中的LiveData   LiveData 具有生命周期感知能力,遵循 activity 和 fragment 等實體的生命周期。您可以使用 LiveData 在這些生命周期所有者和生命周期不同的其他對象(例如 ViewModel 對象)之間傳遞數據。ViewModel 的主要責任是載入和管理與界面相關的數據,因此非常適合作為用於保留 LiveData 對象的備選方法。您可以在 ViewModel 中創建 LiveData 對象,然後使用這些對象向界面層公開狀態。  activity 和 fragment 不應保留 LiveData 實例,因為它們的用途是顯示數據,而不是保持狀態。此外,如果 activity 和 fragment 無需保留數據,還可以簡化單元測試的編寫。   擴展LiveData 如果觀察者的生命周期處於 STARTED 或 RESUMED 狀態,LiveData 會認為該觀察者處於活躍狀態。以下示例代碼說明瞭如何擴展 LiveData 類
public class StockLiveData extends LiveData<BigDecimal> {
    private StockManager stockManager;


    private SimplePriceListener listener = new SimplePriceListener() {
        @Override
        public void onPriceChanged(BigDecimal price) {
            setValue(price);
        }
    };


    public StockLiveData(String symbol) {
        stockManager = new StockManager(symbol);
    }


    @Override
    protected void onActive() {
        stockManager.requestPriceUpdates(listener);
    }


    @Override
    protected void onInactive() {
        stockManager.removeUpdates(listener);
    }
}
當LiveData對象具有活躍觀察者時, 會調用 onActive() 方法。這意味著,您需要從此方法開始觀察股價更新。 當 LiveData 對象沒有任何活躍觀察者時,會調用 onInactive() 方法。由於沒有觀察者在監聽,因此沒有理由與 StockManager 服務保持連接。 setValue(T) 方法將更新 LiveData 實例的值,並將更改告知活躍觀察者。   LiveData使用總結
  1. 創建LiveData,使用viewModel類來包含
  2. 創建觀察者Observer
  3. 調用LiveData的observe方法將LiveData以及Observer建立起發佈-訂閱關係
  4. 在適當的時機調用LiveData的setValue或者postValue發佈新數據通知觀察者
LiveData的優點
  •  

    能夠確保數據和UI統一 LiveData採用了觀察者模式,當數據發生變化時,主動通知被觀察者。
  •  

    解決記憶體泄露問題 由於LiveData會在Activity/Fragment等具有生命周期的lifecycleOwner組件調用onDestory的時候自動解綁,所以解決了可能存在的記憶體泄漏問題。之前我們為了避免這個問題,一般有註冊綁定的地方都要解綁(即註冊跟解綁要成對出現),而LiveData利用生命周期感知功能解決了這一問題,可以實現只需關心註冊,而解綁會根據生命周期自動進行的功能。
  •  

    當Activity停止時不會引起崩潰 當Activity組件處於inactive非活動狀態時,它不會收到LiveData數據變化的通知。
  •  

    不需要手動處理生命周期的變化 觀察者並不需要手動處理生命周期變化對自身的邏輯的影響,只需要關心如何處理獲取到的數據。LiveData能夠感知Activity/Fragment等組件的生命周期變化,所以就完全不需要在代碼中告訴LiveData組件的生命周期狀態,當數據發生變化時,只在生命周期處於active下通知觀察者,而在inactive下,不會通知觀察者。
  •  

    確保總能獲取到最新的數據 什麼意思呢?第一種情況,當觀察者處於active活動狀態。LiveData基於觀察者模式,所以當數據發生變化,觀察者能夠馬上獲取到最新變化;第二種情況,當觀察者處於inactive非活動狀態。LiveData只能生命周期active下發送數據給觀察者。舉個例子,當Activity處於後臺(inactive)時,LiveData接收到了新的數據,但這時候LiveData並不會通知該Activity,但是當該Activity重新返回前臺(active)時會繼續接收到最新的數據。一句話概括,LiveData是粘性的
  • configuration changes時,不需要額外的處理來保存數據我們知道,當你把數據存儲在組件中時,當configuration change(比如語言、屏幕方向變化)時,組件會被recreate,然而系統並不能保證你的數據能夠被恢復的。當我們採用LiveData保存數據時,因為數據和組件分離了。當組件被recreate,數據還是存在LiveData中,並不會被銷毀。
  •  

    資源共用 通過繼承LiveData類,然後將該類定義成單例模式,在該類封裝監聽一些系統屬性變化,然後通知LiveData的觀察者。
LiveData源碼分析:
public interface Observer<T> {
  /**

   * Called when the data is changed.

   * @param t  The new data

   */
  void onChanged(@Nullable T t);
}


// 註意,他是 abstract class
public abstract class LiveData<T> {


  // 只有 onStart 後,對數據的修改才會觸發 observer.onChanged()
  public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {}


  // 無論何時,只要數據發生改變,就會觸發 observer.onChanged()
  public void observeForever(@NonNull Observer<T> observer) {}
}

 

    版權聲明: 作者:ttylinux     出處:http://www.cnblogs.com/ttylinux/     本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # Unity UGUI的所有組件的介紹及使用 本文將介紹Unity UGUI中的各個組件,包括它們的具體介紹、用途 ## 1. Text(文本) - 介紹:Text組件用於在UI界面上顯示文本內容。 - 用途:常用於顯示UI界面的標題、按鈕標簽、提示信息等。 ## 2. Image(圖片) - 介 ...
  • # Unity AssetPostprocessor中Model相關函數的實際應用 Unity AssetPostprocessor是Unity引擎中的一個重要功能,它可以在導入資源時自動一些腳本,以便對資源進行自定義處理。其中,Model相關的函數可以用於對導入的3D模型進行處理,包括修改模型的材 ...
  • 國產系統大勢所趨,如果你公司的winform界面軟體需要在linux上運行,如果軟體是用C#開發的,現在我有一個好的快速解決方案。 世界第一的微軟的Microsoft Visual Studio,確實好用,C# 開發起來確實效率高,不過微軟的開發語言開發的軟體的界面都是跟windows系統綁定的,現 ...
  • 2013年7月1日,痞子衡應屆畢業正式入職飛思卡爾半導體上海 Site,至今已經十年零七天。 上周六是整十年的日子,當時並沒有特別的感覺,但是過去的一周總有種情愫在醞釀,終於今天還是決定花點時間回憶下過去的十年,梳理下那些值得紀念的時刻。 ### Offer抉擇 時間撥回到 2012 年的秋天,痞子 ...
  • 一、影響 Linux 性能的各種因素 1、系統硬體資源 (1)CPU 如何判斷多核 CPU 與超線程 消耗 CPU 的業務:動態 web 服務、mail 服務 (2)記憶體 物理記憶體與 swap 的取捨 選擇 64 位 Linux 操作系統 消耗記憶體的業務:記憶體資料庫(redis/hbase/mong ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230706135746797-1984903730.png) # 1. 複製數據到另一個表 ## 1.1. sql ```sql insert into dept_east ...
  • # 資料庫概論系統—系統篇 ## 一、關係查詢處理和查詢優化 ### 1.1關係資料庫的查詢處理 查詢處理可分為四個階段:查詢分析、檢查檢查、查詢優選和查詢執行(其中查詢優化可分為代數和物理優化) ### 1.2關係資料庫系統的查詢優化 查詢優化的優點不僅在於用戶不必考慮如何最好地表達查詢以獲得較高 ...
  • ## 1. SSL原理 SSL(Secure Sockets Layer)是一種用於安全地傳輸數據的加密協議。在MySQL中,SSL可以用於加密客戶端與伺服器之間的通信,以防止數據被竊取或篡改。SSL通過以下方式實現數據的加密和身份驗證: - **加密通信**:SSL使用非對稱加密和對稱加密相結合的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...