主頁 > 移動端開發 > Android架構組件LiveData

Android架構組件LiveData

2023-07-09 08:01:00 移動端開發

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/    本文著作權歸作者,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/556866.html

標籤:其他

上一篇:Android架構組件LiveData

下一篇:返回列表

標籤雲
其他(162270) Python(38272) JavaScript(25528) Java(18293) C(15239) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7292) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4615) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) HtmlCss(1993) .NET技术(1986) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1882) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • Android架構組件LiveData

    LiveData LiveData是基于觀察者模式創建的,其中,LiveData是被觀察者,觀察者通過注冊方法,監聽被觀察者的資料變化。LiveData在資料發生變化的時候,會通知觀察者。 LiveData是一個容器,存放資料的容器,它的資料變化可以被監聽,也就是LiveData是一個被觀察者,如下 ......

    uj5u.com 2023-07-09 08:01:00 more
  • Android架構組件LiveData

    LiveData LiveData是基于觀察者模式創建的,其中,LiveData是被觀察者,觀察者通過注冊方法,監聽被觀察者的資料變化。LiveData在資料發生變化的時候,會通知觀察者。 LiveData是一個容器,存放資料的容器,它的資料變化可以被監聽,也就是LiveData是一個被觀察者,如下 ......

    uj5u.com 2023-07-09 08:00:40 more
  • hiqradio 一個簡單的收音機軟體

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

    uj5u.com 2023-07-08 08:14:39 more
  • Android實時獲取攝像頭畫面傳輸至PC端

    # 前言 最近在做一個PC端小應用,需要獲取攝像頭畫面,但是電腦攝像頭像素太低,而且位置調整不方便,又不想為此單獨買個攝像頭。于是想起了之前淘汰掉的手機,成像質量還是杠杠的,能不能把手機攝像頭連接到電腦上使用呢?經過搜索,在網上找到了幾款這類應用,但是都是閉源的。我一向偏好使用開源軟體,但是找了挺久 ......

    uj5u.com 2023-07-08 08:14:33 more
  • flutter小白是如何在一周內用chatGPT開發一款App的

    ## 創作初衷 這篇文章創作的初衷,只是為了寫一個有關日歷類的軟體供自己使用,考慮到自己從來還沒有使用flutter正式創作一個app,因此磨刀霍霍想試一試。 至于為什么要做一款日歷軟體,因為發現市面上的關于萬年歷的軟體都有很多廣告,想著自己也能做,就做個給自己用。同時里面包含了額外的模塊,包括萬年 ......

    uj5u.com 2023-07-08 08:14:29 more
  • Android實時獲取攝像頭畫面傳輸至PC端

    # 前言 最近在做一個PC端小應用,需要獲取攝像頭畫面,但是電腦攝像頭像素太低,而且位置調整不方便,又不想為此單獨買個攝像頭。于是想起了之前淘汰掉的手機,成像質量還是杠杠的,能不能把手機攝像頭連接到電腦上使用呢?經過搜索,在網上找到了幾款這類應用,但是都是閉源的。我一向偏好使用開源軟體,但是找了挺久 ......

    uj5u.com 2023-07-08 08:14:07 more
  • 使用GoEasy快速實作Android原生app中的websocket訊息推送

    摘要: GoEasy帶來了一項令開發者振奮的訊息:全面支持Android原生平臺!現在,您可以在Android應用中使用最酷炫的實時通信功能,借助GoEasy輕松實作訊息的發送和接收。本文將帶您領略GoEasy最新版本的威力,為您的應用增添一抹鮮活的互動色彩。 嗨,開發者朋友們!是時候展現您的技術才 ......

    uj5u.com 2023-07-06 09:28:34 more
  • Android Launcher apk 授信安裝

    對安裝的apk進行校驗,除了系統應用市場中下載的,其它渠道的apk都進行安裝攔截,并且彈框提示。 首先需要把驗證的證書保存在資料庫本地,后面需要用到 然后注冊系統廣播,用于接收 apk 安裝時的監聽,這個廣播由系統發出 新裝時的 action ‘android.intent.action.PACKA ......

    uj5u.com 2023-07-06 09:28:26 more
  • 使用GoEasy快速實作Android原生app中的websocket訊息推送

    摘要: GoEasy帶來了一項令開發者振奮的訊息:全面支持Android原生平臺!現在,您可以在Android應用中使用最酷炫的實時通信功能,借助GoEasy輕松實作訊息的發送和接收。本文將帶您領略GoEasy最新版本的威力,為您的應用增添一抹鮮活的互動色彩。 嗨,開發者朋友們!是時候展現您的技術才 ......

    uj5u.com 2023-07-06 09:28:03 more
  • Android Launcher apk 授信安裝

    對安裝的apk進行校驗,除了系統應用市場中下載的,其它渠道的apk都進行安裝攔截,并且彈框提示。 首先需要把驗證的證書保存在資料庫本地,后面需要用到 然后注冊系統廣播,用于接收 apk 安裝時的監聽,這個廣播由系統發出 新裝時的 action ‘android.intent.action.PACKA ......

    uj5u.com 2023-07-06 09:22:49 more