亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android開發者必備的技能你會嗎?MVVM 最新學習心得!

發布時間:2020-08-18 23:50:43 來源:ITPUB博客 閱讀:143 作者:yilian 欄目:移動開發

前言

在前幾年興起了 MVVM架構設計模式,最具有代表的框架就是 DataBinding,雖然這種設計架構非常新穎,但是在使用中仍然還有很多痛點,所以我當時覺得短時間這個設計架構可能不會太流行。

最近接手了新項目,使用的就是 MVVM,才發現只一兩年的功夫 MVVM的發展竟然這么快,已經是Android開發者必備的技能之一了。

正文

DataBinding在剛開始階段,最令我頭疼的就是數據處理的問題,往往為了顯示數據,我要在 XML中綁定 N多個字段,如果是一個中等以上的工程,還有更蛋疼的問題,例如:

  • 你的 XML可能迫切的需要 if或者 switch這樣的判斷;
  • 意想不到的空指針

在2018年, Google推出 JetPack庫,其中的 ViewModel+LIveData終于把 MVVM推上了新的高度。

ViewModel

使用 ViewModel需要依賴 lifecycle庫:

  implementation "android.arch.lifecycle:viewmodel:x.x.x"
  implementation "android.arch.lifecycle:extensions:x.x.x"

ViewModel的創建方法主要有兩種:

  // 獲取FragmentActivity共享的ViewModel
  ViewModelProviders.of(FragmentActivity).get(ViewModel::class.java)  // 獲取FragmentActivity共享的ViewModel
  ViewModelProviders.of(Fragment).get(ViewModel::class.java)

ViewModel的共享范圍主要有兩種:一種是 FragmentActivity,一種是 Fragment,可以根據自己的需要選擇共享的范圍。如果你想要一個 Application級別的 ViewModel,目前是不支持的,你可以自定義 Application持有一個 ViewModel,或者使用單例模式。

ViewModel解決的問題

1、擴大數據共享的應用場景。

一般的數據共享是 ActivityFragment的數據傳遞,傳統做法是使用 setArguments(Bundle),這種方法有以下弊端:

  • 可能無法預測 setArguments會在 Fragment的哪個周期完成,要進行異常判斷;
  • setArguments中的數據可能會發現改變,如果是 Activity直接設置 Fragment的數據,耦合性很高;
  • 數據較多時, Fragment會有很多的變量,影響可讀性和維護性。

使用 ViewModel,可以避免以上的尷尬情況,需要什么數據就從 ViewModel中取:

  • 新加數據傳遞,不用修改 ActivitysetArguments代碼, Fragment也不用編寫數據接收的方法;
  • 減少數據傳遞,不必考慮是否要刪除暫時無用的代碼;
  • 取數據時,請注意數據的有效性,做好判斷即可;

除此之外,自定義 View也可以得到 ViewModel,這樣某些功能耦合性非常強的自定義 View開發更加便捷。不過需要注意的是 Viewcontext的上下文是 Activity類型(不會是 Fragment)的,所以只能使用 Activity級別的數據共享。

2、解決DataBinding的視圖顯示問題。

如果視圖的顯示需要很多的數據,那么 XML就會變得越來越臃腫,并且迫切需要添加一些簡單的判斷,例如:

如果A為空就顯示B,如果B為空就先是C,如果是C為空...

雖然 DataBinding支持三元運算符,能夠滿足if判斷的需要,但是很顯然在 XML維護邏輯要比 Java或者 Kotlin要困難的多(無拼寫錯誤提示等)。所以我們非常需要把部分代碼從 XML分離出來, ViewModel就非常適合擔任這個角色。

修改前:

  <?xml version="1.0" encoding="utf-8"?>
  <layout>
    
      <data>
        
          <variable
                  name="A"
                  type="String" />
          <variable
                  name="B"
                  type="String" />
          <variable
                  name="C"
                  type="String" />
        
        
      </data>
       <TextView
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:maxLines="4"
                  android:ellipsize="middle"
                  android:text="A != null ? A : B != null ? B : C" />
    ...    
  </layout>

修改后:

  <?xml version="1.0" encoding="utf-8"?>
  <layout>
      <data>
          <variable
                  name="viewModel"
                  type="ViewModel" />
      </data>
      <TextView
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:maxLines="4"
                  android:ellipsize="middle"
                  android:text="@{viewModel.getShowContent()}" />
  ...  </layout>
LiveData

剛才我們已經討論了 ViewModel的用法,但是還有一個問題沒有解決,那就是數據更新的問題,解決這個問題的最佳方式就是觀察者模式,但是如果沒有處理好觀察者的注冊和解綁很容易出現內存溢出。 LiveData就可以完美的解決這個問題。

我們需要添加 LiveData的依賴:

  implementation "androidx.lifecycle:lifecycle-livedata:2.1.0"

下面是一個簡單的示例:

  // 名為openDrawer的Boolean類型的LiveData
  public final MutableLiveData<Boolean> openDrawer = new MutableLiveData<>();  // 更新openDrawer
  openDrawer.setValue(true)  // 觀察openDrawer 的值的變化
  openDrawer.observe(this, aBoolean -> {
               Toast.makeText(this, "${aBoolean}", Toast.LENGTH_SHORT).show();
          });

LiveData的子類是 MutableLiveData,內部有 value屬性保存最新的值,訂閱 LiveData的變化,直接調用 LiveData.observe():

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer)
owner:注冊的周期,會在owner銷毀的時候,解綁觀察者。
observer:觀察的值發生變化的回調函數

owner直接使用 Activity或者 Fragment即可。如果你還不了解 Lifecycle的使用,可以查看一下相關的資料。

總結

最后我畫了一張架構圖,總結了一下最新的 MVVM的使用架構:

Android開發者必備的技能你會嗎?MVVM 最新學習心得!

Activity:處理 UI問題,但是應當盡量避免這樣做,盡量統一使用 DataBinding
ViewModel:保存頁面需要的數據,功能復雜的話可以拆分成多個。
DataBinding:處理 UI視圖,持有 ViewModel做數據展示。如果頁面功能比較復雜,可以對 ViewModelDataBinding再次細分。

最后有話說

附上我的Android核心技術學習大綱,獲取相關內容來我的GitHub一起玩耍: https://github.com/Meng997998/AndroidJX
vx:xx1341452

對于進階這條路而言,學習是會有回報的!

你把你的時間投資在學習上,就意味著你可以收獲技能,更有機會增加收入。

在這里分享我的Android學習PDF大全來學習,這份Android學習PDF大全真的包含了方方面面了,內含Java基礎知識點、Android基礎、Android進階延伸、算法合集等等

Android開發者必備的技能你會嗎?MVVM 最新學習心得!

我的這份學習合集,可以有效的幫助大家掌握知識點。

總之也是在這里幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也可以分享給身邊好友一起學習

獲取方式:關注我看個人介紹,或直接  點擊我免費領取

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肥西县| 镇原县| 翁源县| 南岸区| 汕头市| 社会| 夹江县| 随州市| 阿拉善右旗| 武邑县| 丹寨县| 磐石市| 合川市| 疏勒县| 汪清县| 阜宁县| 钟山县| 南华县| 淳化县| 噶尔县| 清镇市| 若尔盖县| 神农架林区| 酒泉市| 遵义县| 南召县| 东阿县| 曲阜市| 攀枝花市| 封丘县| 玉环县| 扶余县| 河曲县| 元阳县| 蒙城县| 肇源县| 海丰县| 平陆县| 宁海县| 年辖:市辖区| 忻城县|