天天看點

android viewbinding_Android 架構元件的最新進展 (上篇)

根據我們曾經做的調查,開發者們希望 Android 官方可以維護一些實用的元件庫和架構實踐,以降低中大型應用的開發門檻,這樣開發團隊就可以集中更多精力在實際業務的優化和改進上。

Jetpack 項目正是為了解決這些問題而誕生的,Jetpack 是一系列助力您更容易打造優秀 Android 應用的工具群組件,這些元件能幫助您遵循最佳實踐、免除編寫繁複的樣闆代碼并簡化複雜任務,進而使您可以專注于最核心的代碼邏輯。其中 androidx.* 庫與 Framework API 解耦,這能夠提供向後相容的同時,也能更頻繁地更新。

Android Jetpack 中的架構元件可幫助您設計穩健、可測試且易維護的應用。從最初釋出的管理 Activity 和 Fragment 生命周期的 Lifecycle 庫和通路 SQLite 資料庫的 Room 庫,後來推出了分頁 (Paging)、導航 (Navigation) 和管理背景任務的 WorkManager 庫。

根據 2019 年最新的開發者調查中,70% 以上的專業開發者用過這五個庫當中的至少一個庫進行應用開發,接下來我們将用上、下兩篇文章為大家介紹 Android 架構元件的最新更新:

android viewbinding_Android 架構元件的最新進展 (上篇)

資料綁定庫

資料綁定 (Data Binding) 庫是一種支援庫,借助該庫,您可以使用聲明性格式 (而非程式化地) 将布局中的界面元件綁定到應用中的資料源。資料綁定可以了解為代碼和 XML 标記語言之間的橋梁。

更快的編譯速度

對開發者來說,處理界面中的資料綁定需要的時間成本不容忽視,我們現在将資料綁定注解處理的速度提高了 20%*。

* Google 内部實測結果。

如果您的工作涉及到協同開發,還有一個好消息,那就是我們增加了對分布式建構緩存的支援。

最後,資料綁定支援增量注解處理,能提升增量建構的性能。但這個功能還停留在測試階段,是以請在 Gradle 配置檔案中使用如下代碼手動打開:

android.databinding.incremental = true           

和 Android Studio 更緊密地內建

實時生成類代碼

現在,給視圖中的某個控件賦予 ID, 它就會在綁定的類中成為一個可用的字段。或者直接在 XML 中設定一個變量,并在視圖中通路,代碼也能馬上給出對應的提示。這些都即時可用,無需編譯!

android viewbinding_Android 架構元件的最新進展 (上篇)
android viewbinding_Android 架構元件的最新進展 (上篇)

更好地支援重構

在 IDE 裡使用重構的方式修改函數名稱之後,XML 中會同步進行更新。

android viewbinding_Android 架構元件的最新進展 (上篇)

更好用的報錯資訊

資料綁定出錯的資訊可能一下子跳出來 1,000 條,這種尴尬将成為過去。現在在建構輸出資訊視窗中,資料綁定錯誤單獨成組,這樣開發者能更輕松地找到自己需要處理的錯誤資訊。

android viewbinding_Android 架構元件的最新進展 (上篇)

有沒有更好的視圖通路方式?

android viewbinding_Android 架構元件的最新進展 (上篇)

視圖通路方法當然不止一種,但正如上圖所示的,在簡明、編譯安全和編譯速度上,各個方法總有取舍。那有沒有一種方法能一石 "三" 鳥呢? 

即将到來!視圖綁定 (View Binding) 

給出 ID 即可自動生成綁定類代碼且能保證編譯安全,能做到一石 "三" 鳥的視圖綁定可在 Android Studio 3.6 Canary 11 或更新版本中用得上。

<LinearLayout>    <TextView android:id="@id/title"/>    <ImageView android:id="@id/photo"/>LinearLayout>class ProfileActivity:AppCompatActivity {    override fun onCreate(savedInstanceState:Bundle?) {        val binding = ProfileBinding.inflate(layoutInflater)        setContentView(binding.root)        // binding.title:TextView        // binding.photo:ImageView    }}           

△ 在生成的綁定類 inflate 之後,即可運作 setContentView,如果綁定的某個類型的控件不存在則無法編譯。是時候告别 findViewById 了

所有的這些綁定類均由 Gradle 插件生成,如果開發者修改了某個布局檔案,會報錯的也會隻有這個檔案,100% 編譯安全。

處理生命周期

"ViewModel 和 SavedState 一樣嗎?ViewModel 會破壞 SavedState 嗎?"

——很多開發者會這麼問

基本上,開發者會通過 ViewModel 或着 SavedState 來儲存自己的内容/狀态,當應用配置發生變化時再從 ViewModel 或者 SavedState 中取回儲存的内容/狀态:

android viewbinding_Android 架構元件的最新進展 (上篇)

如果隻這樣粗略地了解的話,ViewModel 和 SavedState 其實是一回事。然而并不是這樣的。

SavedState 會經由 System Server (一個獨立的程序) 儲存内容 (序列化的資料),也就是說,它會無視程序的限制。

而 ViewModel 則一直運作于程序内,即便應用配置發生變化,隻要程序還在,ViewModel 儲存的内容就不會消失。但隻要程序消失,ViewModel 裡的内容也會消失。

ViewModel 用于:

  • 保留應用對網絡、資料庫的請求
  • 當作大型對象的緩存

SavedState 用于:

  • UI 的狀态記錄,比如選擇區域和滾動距離等
  • 導航狀态鍵值記錄

各取所長,聯手打造流暢體驗

// SavedStateHandleclass UserViewModel(val handle: SavedStateHandle) : ViewModel() {}           

現在使用者的 ViewModel 會在構造函數中接收一個 SavedStateHandle,這樣開發者就能在 ViewModel 中馬上通路 SavedState。 

而這個 SavedStateHandle 内部的邏輯也非常直白: 一個 Map 類的鍵值結構。當然,也提供了 LiveData 供通路,隻不過在這裡使用的是 MutableLiveData (因為 SavedState 是可變的)。

// map-like objectval handle : SavedStateHandle// readval myValue : Int = handle.get("key")// writehandle.put("key", newValue)// orval liveData : MutableLiveData<Int> = handle.getLiveData("key")// observe as usualliveData.observe (lifecycleOwner) { value -> }// writeliveData.value = newValue           

更 Kotlin 友好的代碼

我們會持續確定 Kotlin 語言的首選開發語言地位。其中一個例子就是 liveData.observe 現在支援 lambda 表達式:

// lifecycle-livedata-ktxliveData.observe(lifecycleOwner) { newValue ->}           

另一個例子則是 LiveData 不再需要使用靜态的 Transformations.map 方法:

// lifecycle-livedata-ktx// 以前val mapped = Transformations.map(liveData) {    user -> user.name }// 現在val mapped = liveData.map { user -> user.name }           

ViewModel 的初始化也大幅精簡,以前您可能需要這麼操作:

// ViewModels initializationlateinit var userViewModel: UserViewModelfun onCreate(bundle: Bundle?) {    userViewModel = ViewModelProviders.of(this)        .get(UserViewModel::class.java)}           

而現在隻需要一行:

// ViewModels initializationval userViewModel: UserViewModel by viewModels()           

導航

導航 (Navigation) 是一套管理應用内 UI 流程的 Jetpack 代碼庫,現已釋出了 2.1 的穩定版,與此同時下一個版本也已經出現在了不遠的前方,接下來我們會:

  • 在導航中提供成組 (Scoped) ViewModel,比如一套登入流程的界面集合就可以用一個 ViewModel 來管理
  • 使用 URI 直接導航
  • 對話框可以做為導航目标
  • 更好地對動态功能做出支援

請大家保持對本次連載的關注,我們會在下篇中為大家介紹分頁庫、Room 持久性庫和 WorkManager 的更新進展。您也可以觀看  ☟下面的視訊☟  重溫我們對架構元件進展的介紹。

  • 騰訊視訊連結https://v.qq.com/x/page/g30084zstx6.html
  • Bilibili 視訊連結https://www.bilibili.com/video/av71179658/

希望在了解完架構元件的最新進展後,大家能在其中找到适合自己應用的功能。如果對架構元件有疑問或者建議,歡迎在評論區和我們分享。 

android viewbinding_Android 架構元件的最新進展 (上篇)

 點選屏末 | 閱讀原文 | 進一步了解 Android Jetpack

android viewbinding_Android 架構元件的最新進展 (上篇)
android viewbinding_Android 架構元件的最新進展 (上篇)

  想了解更多 Android 内容?

  • 在公衆号首頁發送關鍵詞 “Android”,擷取相關曆史技術文章;
  • 還有更多疑惑?歡迎點選菜單 “聯系我們” 回報您在開發過程中遇到的問題。

推薦閱讀

android viewbinding_Android 架構元件的最新進展 (上篇)
android viewbinding_Android 架構元件的最新進展 (上篇)
android viewbinding_Android 架構元件的最新進展 (上篇)
android viewbinding_Android 架構元件的最新進展 (上篇)